我有两个课程:World
和Entity
。
在世界之内我有两个实体指针,我这样做:
Entity* ent1;
Entity* ent2;
我想允许Entity对象调用World的公共成员函数。 我以为我可以简单地将一个引用或指针传递给实体。
但是当我从World.h
加入Entity.h
时,我开始收到错误。
它似乎有点不对,因为它们相互包含但我对如何实现此功能一无所知。
在其他编程语言中,我见过 parent 关键字,在C ++中有类似的东西吗?
答案 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