1

我对在 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  

在从该实体继承的类中。为什么会发生这种情况?

在 C++ 中是完全不能接受的吗?

可能实体必须是抽象的?我想就可能的解决方法获得建议。

4

3 回答 3

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>
{
    // ...
};
于 2012-11-07T17:47:13.410 回答
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
于 2012-11-07T17:48:58.440 回答
1

您的代码如下所示:

struct D : B {}; // error: B doesn't mean anything at this point

struct B {
    D *d;
};

您的标头 ExtendedEntity.h 试图在定义 Entity 之前使用 Entity 的定义。

您需要将代码更改为:

struct D;

struct B {
    D *d;
};

struct D : B {};
于 2012-11-07T17:55:15.400 回答