クラス内構造体

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
こげちゃん

クラス内構造体

#1

投稿記事 by こげちゃん » 13年前

初めまして、こげちゃんと申します。
先日から私用のライブラリを作っているのですが躓いた点がありましたので質問させていただきます。

コード:

//a.h
class A{
public:
    struct{
    }B;
private:
    B* func();
}
//a.cpp
B* A::func(){
    B b;
    return &b;
}
上記のようにクラスAで宣言した構造体Bのポインタを戻り値としたいのですが、a.cpp内B b;の部分でBを識別子として認識してくれません。
VCを使っていて、error C2079というエラーが出てきます。
何か良い方法はないでしょうか?

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: クラス内構造体

#2

投稿記事 by beatle » 13年前

B* A::func()でコケるのではなくて、B b;の部分でコケるのですね?
ちなみに、ローカル変数bのアドレスを戻すのは違反なのでやめましょう。(12行目がダメ)

こげちゃん

Re: クラス内構造体

#3

投稿記事 by こげちゃん » 13年前

return &eはルール違反ですか・・・
Aとはまた違うクラス内でBを使いたかったのですが、同じようにC2079のエラーが出たので、Aでポインタを返すfuncを作って代用するつもりだったのです・・・
質問を少し変えさせていただきます。

コード:

//a.h
class A{
public:
    struct{
    }B;
};
//c.h
class C{
    void func();
}
//c.cpp
void C::func(){
    struct B b;//ここでC2079のエラーが出ます
}
上記コードでのエラーはどのように回避すればいいでしょうか?

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: クラス内構造体

#4

投稿記事 by beatle » 13年前

それはクラスCの中からBが見えないだけだと思います。
A::B b;
とやれば解決すると思いますがいかがでしょうか。

こげちゃん

Re: クラス内構造体

#5

投稿記事 by こげちゃん » 13年前

その場合もC2079というエラーが出ます
正確にはerror C2079: 'b' が 未定義の struct 'A::B' で使用しています。 という風になります

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: クラス内構造体

#6

投稿記事 by softya(ソフト屋) » 13年前

クラスCでクラスAのBの実体の参照をしたいように見えますが、良くない設計なので止めたほうが良いと思います。
戻り値で返すならポインタではなく構造体を返すとかではダメなのですか?
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

beatle
記事: 1281
登録日時: 14年前
住所: 埼玉
連絡を取る:

Re: クラス内構造体

#7

投稿記事 by beatle » 13年前

よく見たら、Bって型名じゃなくて変数名ですね。

コード:

struct {
} B;
は、無名構造体型の変数Bという意味になります。
やりたいのは

コード:

struct B {
};
では?

こげちゃん

Re: クラス内構造体

#8

投稿記事 by こげちゃん » 13年前

まさにそうでした・・・
struct B{
}
にしたところうまくいきました

回答いただいた皆様ありがとうございます

閉鎖

“C言語何でも質問掲示板” へ戻る