我对在C ++中引用超类内部的子类感到困惑。 例如,给定Java:
public class Entity {
protected ComplexEntity _ce;
public Entity() {
}
public ComplexEntity getCentity() {
return _ce;
}
}
ComplexEntity扩展实体。它工作。在子类中,我调用getCentity()没有错误。
现在,在C ++中,当我写这样的东西时:
#pragma once
#include "maininclude.h"
#include "ExtendedEntity.h"
using namespace std;
class EntityBase
{
public:
EntityBase(void);
EntityBase(const string &name);
~EntityBase(void);
protected:
ExtendedEntity* _extc;
string _name;
};
我收到编译错误:
error C2504: 'Entity' : base class undefined
在继承自此Entity的类中。为什么会发生这种情况?
在C ++中完全不可接受吗?
可能是实体必须是抽象的吗? 我想就可能的解决方法提出建议。
答案 0 :(得分:3)
您可以考虑使用CRTP,来自维基百科的剪切/粘贴:
// The Curiously Recurring Template Pattern (CRTP)
template<class Derived>
class Base
{
Derived* getDerived() { return static_cast<Derived*>(this); }
};
class Derived : public Base<Derived>
{
// ...
};
答案 1 :(得分:1)
C ++中的类需要知道其所有成员及其所有超类的大小。除非在类Entity
之前定义了类ComplexEntity
,否则类ComplexEntity
不知道它的子类Entity
的大小。但是,类ComplexEntity
不知道其超类Entity
的大小。
C ++中存在此问题,因为使用简单偏移计算访问类成员。您可以通过前向声明派生类并使用指针作为成员来解决此问题:
class Extended; // declare the derived class
class Base { // define the base class
Extended* e; // you cannot use Extended e here,
// because the class is not defined yet.
};
class Extended : public Base {}; // define the derived class
答案 2 :(得分:1)
您的代码如下:
struct D : B {}; // error: B doesn't mean anything at this point
struct B {
D *d;
};
你的标题ExtendedEntity.h试图在定义实体之前使用实体的定义。
您需要将代码更改为:
struct D;
struct B {
D *d;
};
struct D : B {};