7

次のコードをコンパイルしていました。

class B;

class A {
    A();
    friend A B::newAObject();
};

class B {
    friend A::A();
public:
    A newAObject();
};

これは奇妙に思えるかもしれませんが、アイデアはA、型のオブジェクトB(おそらくシングルトン) によってのみ生成できるクラスを持つことでした。

問題は、これらのオブジェクト間に循環依存関係を作成したことです。Aの前に定義する必要があり、 の前に定義するB必要BがありますA。どうやら前方宣言Bは十分ではなく、B実際には事前に完全に定義する必要がありますA(逆も同様です)。

どうすればこれを回避できますか?

編集:実際のエラーは次のとおりです:ネストされた名前指定子で指定された不完全な型 'B'。

注: ここに似た別の投稿があります:エラー: 入れ子になった名前指定子で使用される不完全な型ですが、非常にテンプレート化されており、混乱していたため、この投稿です。

4

1 に答える 1

6

C++2003 では、クラスのコンテンツにアクセスするときに、このクラスを完全に定義する必要があると規定されています。前方宣言は十分ではありません。これは、あなたのような循環依存が単に許可されていないことを意味します。

ps クラス全体をフレンドとして宣言するだけで十分な場合は、うまくいくはずです。

ところで、フレンド仕様はクラスの前方宣言を生成します。次のコードを見てください。

void    F10(C1 &p1); 

class C2 
{ 
    friend class C1; 
}; 

void    F11(C1 **p1);

F10C1 が定義されていないため、コンパイラは構文エラーを返しますF11が、フレンド仕様により正常にコンパイルされます。これは奇妙に聞こえるかもしれませんが、これは標準で定義されており、コンパイラはこれに従います。

于 2012-07-02T01:11:17.433 に答える