2016-04-26 18 views
0

私はC++の比較的新しいです、と私はシンプルな2Dエンジンを記述しようとしています。しかし、他の言語では問題ない現在の構造に問題があります(AS3など)。私は2つのクラス、1つはDisplayObjectと呼ばれ、もう1つはDisplayObjectContainerです。 DisplayObjectContainerはDisplayObjectのサブクラスですが、DisplayObjectはDisplayObjectContainerの親を指すポインタをプロパティとして持っています。私は彼らのファイルにお互いを適切に含める方法を理解できません。 DisplayObject内のDisplayObjectContainerのメソッドにアクセスする必要があるため、DisplayObject内でDisplayObjectContainerを宣言することはできません。C++循環依存

のDisplayObject:

class DisplayObject 
{ 
    public: 

     DisplayObjectContainer *parent; 
... 
    ...this->parent->globalTransform... 
... 

のDisplayObjectContainer:

class DisplayObjectContainer : public DisplayObject 
{ 
    public: 
     DisplayObjectContainer(); 
     virtual ~DisplayObjectContainer(); 

    protected: 

    private: 
}; 

任意の助けいただければ幸いです。ありがとう!

+0

まず、なぜ親クラスは、特定の派生クラスについて知っていますか?それにもかかわらず、 'DisplayObject'を含むヘッダ(前方参照されない' DisplayObjectContainer * 'しか持たない)に前方宣言を使用し、ソースファイルに 'include'を置く必要があります(例えば' DisplayObject.cpp ')を使用します。 –

答えて

1

あなたの問題を解決するためにいくつかの方法がありますが、単純に別のクラスとクラスの実装へDisplayObjectを分割する最も簡単な。したがって、ヘッダーファイルでクラスを定義し、別のソースファイルにメンバー関数を実装します。

DisplayObjectのヘッダーファイルは、DisplayObjectContainerのヘッダーファイルを必要としません。そのためには、DisplayObjectContainerクラスの前方宣言が必要です。

ヘッダファイル内でこのような何か

#pragma once 

// Forward declaration of the class 
class DisplayObjectContainer; 

class DisplayObject 
{ 
private: 
    DisplayObjectContainer *parent; 
    ... 
}; 

、ソースファイルでは、ヘッダーファイルをインクルード:

#include "DisplayObject.h" 
#include "DisplayObjectContainer.h" 

// Here you can use the members of DisplayObjectContainer 

難しい方法はDisplayObjectように設計を変更することです実際にどのコンテナに格納されているかを知る必要はありません。このデカップリングはおそらく長期的には優れていますが、前述のようにプロジェクトの再設計が必要です。

+0

これは重複として閉じられませんか? –

+0

ありがとうございました!最初の提案は問題を解決しました。 2番目の提案では、私はそれを再設計することを検討しますが、私が従う構造はAdobe Flashと全く同じ構造です。 – TommyX