在类a声明之前从类a继承类b

时间:2012-06-14 05:41:36

标签: c++ inheritance derived-class

我希望在CDocument实际声明之前从另一个名为CDocument的类继承一个名为CSprite的类,因为CDocument类的某些成员实际上是CSprite。我希望它似乎不会令人困惑?这是我的代码:

class CSprite: public CDocument {}

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

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

我收到“基类未定义”错误。我想知道可能这根本不可能。是吗?我这样做的原因是增加了我的代码可读性。每个文档都可以有很多精灵。精灵实际上是文件,里面可以有其他的精灵。

4 个答案:

答案 0 :(得分:3)

不可能继承不完整类型 您可以通过以下不同方式解决问题:

  1. 更改派生类所依赖的依赖项所在的设计 在基类
  2. 具有派生类的指针或引用 在基类中,派生类是前向声明的
  3. 以类似的方式使基类成为template CRTP

答案 1 :(得分:3)

由于CDocument.AddSprite / GetSprite都返回一个CSprite指针,您可能只需要声明文档中是否存在CSprite。

//declare CSprite
class CSprite;

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

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

您可以在此文件或其他文件中定义CSprite Later,此时您应该能够继承CDocument。虽然如果遇到更多问题,您可能需要重新设计对象结构。

//CSprite Class
class CSprite : public CDocument
{
    ...
};

答案 2 :(得分:2)

不,那是不可能的。在定义派生类之前,需要完全了解基类。

这看起来像一个破碎的设计。您可以通过首先声明CDocument并更改签名来修复:

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

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

class CSprite: public CDocument {}

答案 3 :(得分:2)

基地模板:

class Document;

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

class Document { /* etc. */};