我希望在CDocument实际声明之前从另一个名为CDocument的类继承一个名为CSprite的类,因为CDocument类的某些成员实际上是CSprite。我希望它似乎不会令人困惑?这是我的代码:
class CSprite: public CDocument {}
class CDocument
{
public:
CDocument();
~CDocument();
CSprite * AddSprite(string Name);
CSprite * GetSprite(string Name);
};
我收到“基类未定义”错误。我想知道可能这根本不可能。是吗?我这样做的原因是增加了我的代码可读性。每个文档都可以有很多精灵。精灵实际上是文件,里面可以有其他的精灵。
答案 0 :(得分: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. */};