У меня есть два класса: World
, а также Entity
,
Внутри мира у меня есть два указателя сущности, которые я сделал так:
Entity* ent1;
Entity* ent2;
Я хотел позволить объектам Entity вызывать публичные функции-члены World.
Я думал, что могу просто передать ссылку или указатель Мира на сущность.
Но когда я включаю World.h
от Entity.h
Я начинаю получать ошибки.
Это кажется немного неправильным, поскольку они включают друг друга, но у меня нет другого представления о том, как добиться этой функциональности.
В других языках программирования я видел родитель Ключевое слово, есть что-нибудь подобное в C ++?
Заранее объявить класс Entity
в World.h.
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();
}
Что вы можете сделать, это сделать метод в родительском классе виртуальным и переопределить его в классе сущности.
class World
{
public:
virtual void Func();
}class Entity: public World
{
public:
void Func();
}
Из вашего описания я предполагаю, что у вас есть проблема циклической зависимости. Вы пытались использовать #pragma один раз. Вот ссылка ссылка на сайт. Если вам это не нравится, вы можете попробовать добавить несколько 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