1

私は、OlderSon が Parent から継承し、Parent が彼の OlderSon へのポインタを持つ、非常に単純な Child-Parent 関係を持っています。

#ifndef PARENT_HXX
#define PARENT_HXX

#include <iostream>
#include <string>    
//#include "OlderSon.hxx"

class OlderSon;

class Parent
{
private :
    OlderSon* _os;
public  :           
    int _age;
    std::string _name;

    Parent(){
        _name="parent name";
        _age=60;
        //OlderSon* _os=new OlderSon();
    }
};

#endif //PARENT_HXX 

そして息子:

#ifndef OLDERSON_HXX
#define OLDERSON_HXX

#include <iostream>
#include <string>
#include "Parent.hxx"


class OlderSon: public Parent 
{
public:
    OlderSon(){
        _age=25;
        _name="Olderson name";
    }


 };

#endif //OLDERSON_HXX

ただし、ポインターが初期化されている行のコメントを外そうとするとOlderSon* _os=new OlderSon();、エラーメッセージが表示されます。

Parent.hxx: In constructor ‘Parent::Parent()’:
Parent.hxx:25:31: error: invalid use of incomplete type ‘struct OlderSon’
Parent.hxx:8:7: error: forward declaration of ‘struct OlderSon’

私はさまざまな方法で試しました。つまり、.hxx の両方を含めるか、前方宣言によって試しましたが、何も役に立たないようです。それほど複雑な問題ではないと思いますが、イライラし始めています。
何か案は?
前もって感謝します!

4

3 に答える 3

4

あなたは不可能を試みています。の実装を実装ファイルに移動することでバグを修正できますParent:Parentが、それでもコードは悲惨なものになります。

親を構築するには、OlderSonを構築する必要があり、OlderSonを構築するには、親も構築する必要があります(OlderSon親であるため)。無限の再帰があります。

親のコンストラクターにOlderSonのコンストラクターを呼び出させることはできません。その逆も同様です。

于 2012-04-17T10:25:44.357 に答える
0

子ポインタをParent*like;として定義してみませんか。

class Parent
{
private :
    Parent* _os;
.
.
.
}

子の基本クラスは親なので。

于 2012-04-17T10:25:43.360 に答える
0

Parent()コンストラクターは、OlderSon()のコンストラクターを使用します。しかし、あなたはそれを前向きに宣言しただけなので、それはOlderSonを知りません。(つまり、OlderSonというクラスを使用しますが、このヘッダーファイルではポインタのみを使用しているため、(Parent.hxx)が知っている必要があるのはその名前だけです。) OlderSon.hxxをインクルードするcxxファイルのParent()コンストラクター

編集:

OlderSonがParentから継承するという事実を監視しました...これは無限の再帰をもたらしますが、これはおそらくあなたが望むものではありません。

于 2012-04-17T10:27:04.803 に答える