1

我想在实际声明 CDocument 之前从另一个名为 CDocument 的类继承一个名为 CSprite 的类,因为 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 回答