ページ 11

クラス内構造体

Posted: 2012年10月27日(土) 19:58
by こげちゃん
初めまして、こげちゃんと申します。
先日から私用のライブラリを作っているのですが躓いた点がありましたので質問させていただきます。

コード:

//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というエラーが出てきます。
何か良い方法はないでしょうか?

Re: クラス内構造体

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

Re: クラス内構造体

Posted: 2012年10月27日(土) 20:23
by こげちゃん
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のエラーが出ます
}
上記コードでのエラーはどのように回避すればいいでしょうか?

Re: クラス内構造体

Posted: 2012年10月27日(土) 20:32
by beatle
それはクラスCの中からBが見えないだけだと思います。
A::B b;
とやれば解決すると思いますがいかがでしょうか。

Re: クラス内構造体

Posted: 2012年10月27日(土) 20:34
by こげちゃん
その場合もC2079というエラーが出ます
正確にはerror C2079: 'b' が 未定義の struct 'A::B' で使用しています。 という風になります

Re: クラス内構造体

Posted: 2012年10月27日(土) 20:50
by softya(ソフト屋)
クラスCでクラスAのBの実体の参照をしたいように見えますが、良くない設計なので止めたほうが良いと思います。
戻り値で返すならポインタではなく構造体を返すとかではダメなのですか?

Re: クラス内構造体

Posted: 2012年10月27日(土) 21:03
by beatle
よく見たら、Bって型名じゃなくて変数名ですね。

コード:

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

コード:

struct B {
};
では?

Re: クラス内構造体

Posted: 2012年10月27日(土) 21:17
by こげちゃん
まさにそうでした・・・
struct B{
}
にしたところうまくいきました

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