Вызов функции-члена для родительского объекта?

У меня есть два класса: World, а также Entity,

Внутри мира у меня есть два указателя сущности, которые я сделал так:

Entity* ent1;
Entity* ent2;

Я хотел позволить объектам Entity вызывать публичные функции-члены World.
Я думал, что могу просто передать ссылку или указатель Мира на сущность.

Но когда я включаю World.h от Entity.hЯ начинаю получать ошибки.
Это кажется немного неправильным, поскольку они включают друг друга, но у меня нет другого представления о том, как добиться этой функциональности.

В других языках программирования я видел родитель Ключевое слово, есть что-нибудь подобное в C ++?

0

Решение

Заранее объявить класс 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();
}
1

Другие решения

Что вы можете сделать, это сделать метод в родительском классе виртуальным и переопределить его в классе сущности.

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

Из вашего описания я предполагаю, что у вас есть проблема циклической зависимости. Вы пытались использовать #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
0
По вопросам рекламы [email protected]