1

CDocumentクラスの一部のメンバーは実際にはCSpriteであるため、CDocumentが実際に宣言される前に、CDocumentという名前の別のクラスからCSpriteという名前のクラスを継承したいと思います。混乱しないように願っていますか?これが私のコードです:

class CSprite: public CDocument {}

class CDocument
{
public:
    CDocument();
    ~CDocument();

    CSprite * AddSprite(string Name);
    CSprite * GetSprite(string Name);
};

「基本クラスが未定義」というエラーが発生します。これはまったく不可能なのではないかと思います。それは...ですか?これを行う理由は、コードの可読性を高めるためです。すべてのドキュメントは多くのスプライトを持つことができます。スプライトは、実際には他のスプライトを内部に持つことができるドキュメントです。

4

4 に答える 4

3

不完全な型からの継承はできません。
次のさまざまな方法で問題を解決できます。

  1. 依存関係が派生クラスが基本クラスに依存する場所の設計を変更する
  2. 派生クラスが前方宣言されている基本クラス内の派生クラスのポインターまたは参照を持っている
  3. CRTPtemplateと同様 の方法で基本クラスをaにします
于 2012-06-14T05:46:11.157 に答える
3

CDocument.AddSprite / GetSpriteは両方ともCSpriteポインターを返すため、ドキュメント内にCSpriteの存在を宣言するだけでよい場合があります。

//declare CSprite
class CSprite;

class CDocument
{
public:
    CDocument();
    ~CDocument();

    CSprite * AddSprite(string Name);
    CSprite * GetSprite(string Name);
};

CSpriteは、このファイルまたは別のファイルで後で定義できます。その時点で、CDocumentを継承できるはずです。さらに問題が発生した場合は、オブジェクト構造を再設計することをお勧めします。

//CSprite Class
class CSprite : public CDocument
{
    ...
};
于 2012-06-14T05:51:56.610 に答える
2

いいえ、それは不可能です。派生クラスを定義する前に、基本クラスを完全に知っている必要があります。

それは壊れたデザインのように見えます。最初にCDocumentを宣言し、署名を変更することで修正できます。

class CDocument
{
public:
    CDocument();
    ~CDocument();

    CDocument * AddSprite(string Name);
    CDocument * GetSprite(string Name);
};

class CSprite: public CDocument {}
于 2012-06-14T05:46:02.810 に答える
2

ベースのテンプレート:

class Document;

template<class Document=Document> class Sprite_t : public Document {  };
typedef Sprite_t<Document> Sprite;

class Document { /* etc. */};
于 2012-06-14T05:47:45.073 に答える