2016-06-29 4 views
0

クラスボディ内でネストされていないクラスを宣言する方法は2つあります。ネストされていないクラスをクラス本体にforward宣言する方法

class A 
{ 
    friend class B; // B is forward-declared + friend 
}; 

そして第二には、次のとおりです:

まずある

class A 
{ 
    class B* ptr; // B is forward-declared + pointer 
}; 

それはクラス本体の外側に転送-宣言クラスすることは可能ですが、特定の理由のは、このオプションを忘れてみましょう。

だから、私は、このようなメンバーを宣言する可能にしたいと思います:

class A 
{ 
    /* somehow declare B in the body*/ 
    B* getInstanceB(); 
}; 

それは言及する価値がある、それ:friend宣言で

class A 
{ 
    class B* pointer; 
    B* getInstanceB(); //fine 
}; 

: ポインタを宣言して

class A 
{ 
    friend class B; 
    B* getInstanceB(); //GCC 5.3.0 issues error, MSVC compiles 
}; 

このような前方宣言構文がないことは深く残念ですlike:

class ::[optional-namespace::]ClassName;

ネストされたクラスの前方宣言とネストされたクラスの前方宣言を区別します。他の方法で現在の標準でそれを行うことは可能ですか?

+3

'' A'の外B'を宣言前進して何が悪いのでしょうか? – erenon

+0

@erenon間違いはありません。しかし、別の可能性がある場合、私はそれを知りたいです:) – xinaiz

+0

私はこれを手放すしましょう。既存のソリューションが存在し、うまく機能しているときに、問題とは異なる解決策があるかどうかを調べようとしています。 –

答えて

2

、次のような何かを行うことができます。

class A { 
    typedef class B B; 
    // do something with B 
}; 

説明はhereを見つけることができます。

これは、実際に作業を行うことをデモンストレーションは:http://coliru.stacked-crooked.com/a/27913ce45a572d36

+0

これは前方宣言と同等ですか? (クラスAの直後に 'B * ptr;'を置いてテストする) –

+0

@DieterLückingOPは前方宣言が 'A'のクラス定義の中にあることを望んでいます。 – Brian

0

だから、あなたは何をしようとしているのは、別のクラス内のクラスのインスタンスを持っていますが、 "コンテナクラス"の後の定義ですか?

//forward declaration of B 
class B; 

class A 
{ 
    public: 
    B* getInstanceB(); 

    private: 
    B b_; 

}; 

B* A::getInstanceB() 
{ 
    return &b_; 
} 

//implementation of B 
class B{}; 

このような?

HTH

+0

いいえ、私はこの例では避けたかったのです。それはクラスAのボディの内部ではなく前方で宣言するBクラスです。 – xinaiz

+0

あなたはクラスA内の名前空間ステートメントを作成することができます 参照:http://www.cplusplus.com/doc/tutorial/namespaces/ – jaaq

0

私は深くそのような将来の宣言構文のような存在しないことを後悔:

class ::[optional-namespace::]ClassName; 

ネスト解除クラス前方宣言から入れ子になったクラスの前方宣言を区別します。他の方法で現在の標準でそれを行うことは可能ですか?

いいえ、私はないと思います。転送-宣言するAのクラス定義の内部Bという名前のクラスを、そのクラスがA内でネストされなくても、

関連する問題