1

親属性、として含まれています:C++。子が親から継承され、のようなOlderSonは親から継承し、親が自分のOlderSonへのポインタを持って、私は非常に単純な親子関係を持っている

#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と前方宣言の両方を含んでいましたが、何も助けてくれないようです。私はそれが非常に複雑な問題ではないと思うが、それはイライラし始めている。
アイデアをお探しですか?
ありがとうございます!

+0

あなたの息子は親ですか?多分あなたは 'Person'基底クラスを持たなければならず、Personインスタンスを他の' Person'インスタンスと '組み合わせて'ファミリを作るようにしてください。 – Dennis

+0

こんにちは、今あなたはそれが息子の概念を指摘する/親は多くの意味をなしません。しかし、私はSon/Parentに名前を変更して、より明確に説明しようとしました。実際、これらのクラスはFactoryメソッドの一部です。ゲーム内に新しいキャラクターと新しいアイテムの両方を作りたいと思っています。私は 'ObjectFactory'(親として)を作成しました。これは、ITEMやCHARACTERを作りたいと思っています。 'ItemFactory'の属性となる' ItemFactory'と 'CharacterFactory'の2つのサブクラスです。その場合に応じて、 'ItemFactory'または' CharacterFactory'の '.createObject(...) 'を使用します。 – lllllll

+0

何もフィルタリングする必要はありません。 ObjectFactoryは抽象型でなければならず、ユーザーが項目を作成したい場合は、ItemFactoryを使用するだけです。 – Dennis

答えて

0

なぜ、あなたは親のように子ポインタを定義しませんか?

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

子の基本クラスは親であるため、

+0

アドバイスをいただきありがとうございますが、すべてのエラーを修正しているようです。 – lllllll

+0

osをParentのポインタに変更すると、不透明なポインタ "class OlderSon;"を削除できます。あなたのエラーのいくつかを削除するparent.hxxにあります。 – sardok

+0

しかし、 'OlderSon'クラスでどのようにメソッドを使うことができますか?私はそれを使用したいと思うたびにキャストする必要がありますか?また、属性(名前、年齢など)は、「OlderSon」ではなく「Parent」の属性になります。 – lllllll

4

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

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

親のコンストラクタでOlderSonのの両方の呼び出しを行うことはできません。

+0

こんにちは、返信いただきありがとうございます。私は、ParentクラスのOlderSon属性がプライベートなので、OlderSonに継承されていないと考えました。私はそれを描写した:
インスタンス化Parent - > Parentの属性としてOlderSonをインスタンス化しますが、private属性は継承されないため再帰を停止します。私は間違っていた? – lllllll

+0

これはアクセス制限です。彼らはメンバーが存在しないようにしません。派生クラス*は、親クラスのインスタンスであり、すべての機能を持ちます。 (そして、それについて考えてみましょう - それでは、そのようなコードラインはどうでしょうか?そのような変数にアクセスした基本クラスメンバ関数を実行した場合どうなりますか?) –

+0

私は、そのラインが継承された属性Parentクラスから取得します。あなたが実際にParentクラスにキャストすることができるので、それはアクセス制限の問題であるという意味になります。それでは、このコンセプトの実装をどうすればいいのか分かりません。 – lllllll

0

Parent()コンストラクタは、OlderSon()のコンストラクタを使用します。 しかし、あなたはそれを前方宣言しただけなので、OlderSonを知らない。 (これはOlderSonというクラスを使用するつもりですが、このヘッダーファイルではポインタのみを使用しているため、あなた(Parent.hxx)がその名前を知っておく必要があります。 あなたがOlderSon.hxxが含まCXXファイル内の親()コンストラクタを実装

編集:私はおそらく無限再帰になりOlderSonが...親から継承しているという事実を、監督

あなたが望むものではありません。

+0

原則として、.hxxファイルに直接実装できるようにしたかったのです。 @DavidSchwartzが指摘したように、あなたは無限回帰について正しいと思います。私はこれを再設計する方法について考えています。 – lllllll

関連する問題