在父对象上调用成员函数?

时间:2013-04-22 22:42:26

标签: c++ class superclass

我有两个课程:WorldEntity

在世界之内我有两个实体指针,我这样做:

Entity* ent1;
Entity* ent2;

我想允许Entity对象调用World的公共成员函数。 我以为我可以简单地将一个引用或指针传递给实体。

但是当我从World.h加入Entity.h时,我开始收到错误。 它似乎有点不对,因为它们相互包含但我对如何实现此功能一无所知。

在其他编程语言中,我见过 parent 关键字,在C ++中有类似的东西吗?

3 个答案:

答案 0 :(得分:1)

World.h 中转发声明课程Entity

<强> World.h:

class Entity; // #include "Entity.h" is not needed, because
              // only a pointer to Entity is used at the moment.

class World {
  public:
    void foo() {}

    void letEntityDoFooToMe(); // Implementation must be defined later, because it
                               // will use the whole Entity class, not just a
                               // pointer to it.
  private:
    Entity* e;
};

<强> Entity.h:

#include "World.h" // Needed because Entity::doFooToWorld calls a method of World.

class Entity {
  public:
    Entity(World& world) : w(world) {}

    void doFooToWorld() {
      w.foo();
    }

  private:
    World& w;  
};

<强> World.cpp:

#include "World.h"  // Needed because we define a method of World.
#include "Entity.h" // Needed because the method calls a method of Entity.

void World::letEntityDoFooToMe() {
  e->doFooToWorld();
}

答案 1 :(得分:0)

您可以做的是将父类中的方法设为虚拟,并在实体类中覆盖它。

class World
{
public:
    virtual void Func();
}


class Entity: public World
{
public:
    void Func();
}

答案 2 :(得分:0)

根据您的描述,我的猜测是您遇到了一些循环依赖问题。你试过使用#pragma一次吗?这是参考link。如果你不喜欢,你也可以尝试在每个标题中添加一些ifndef。

// World.h
#ifndef WORLD_H
#define WORLD_H

// ... World declaration code goes here.

#endif

// Entity.h
#ifndef ENTITY_H
#define ENTITY_H

// ... Entity declaration code goes here.

#endif