У меня есть следующая иерархия:
У меня есть следующая иерархия:
GameStateBaseClass -> IGameStateInterface -> IntroState
Проблема, с которой я сталкиваюсь, заключается в том, что при создании экземпляра IntroState с использованием ссылки на GameEngine (как я определил в GameStateBaseClass) я получаю следующую ошибку:
Ошибка 1, ошибка C2664: «IntroState :: IntroState (const IntroState &)»:
невозможно преобразовать параметр 1 из GameEngine в const
Short :: IntroState & '
Внутри GameStateBaseClass я определяю конструктор, который принимает константную ссылку GameState, а в main.cpp я передаю экземпляр игрового движка. С какой стати он пытается преобразовать мой параметр GameEngine в ссылку IntroState?
Вот соответствующий код:
GameStateBaseClass.hpp
class GameStateBaseClass
{
public:
GameStateBaseClass(const GameEngine &instance);
private:
GameStateBaseClass(void); // = delete; // c++1x
GameStateBaseClass(const GameStateBaseClass &instance); // = delete; // c++1x
GameStateBaseClass operator=(const GameStateBaseClass &instance); // = delete; // c++1x
// private members
const GameEngine &game_engine_instance;
}
GameStateBaseClass.cpp
GameStateBaseClass::GameStateBaseClass(const GameEngine &instance)
: game_engine_instance(instance) {
}
// IGameStateInterface.hpp
class IGameStateInterface : GameStateBaseClass
{
public:
virtual void Init() = 0;
virtual void Cleanup() = 0;
... // other virtual void methods...
}
IntroState.hpp
class IntroState : public IGameStateInterface
{
virtual void Init() {}
virtual void Cleanup() { }
// other empty bodies
}
Вот файл движка игры .hpp,
GameEngine.hpp
// forward declaration
class IGameStateInterface;
class GameEngine
{
public:
void Init();
void CLeanup();
void SetState(IGameStateInterface *state);
void AddState(IGameStateInterface *state);
// ... other methods for the engine
};
В моем main.cpp у меня есть следующее:
int main(...) {
GameEngine engine_intance;
// instantiate the engine
engine_instance.Init();
// load the intro state
engine_instance.AddState(new IntroState(engine_instance));
// main loop
....
return 0;
}
Я бы хотел использовать конструктор, который я определил в GameStateBaseClass, тот, который использует константную ссылку GameEngine для создания IntroState, а не тот, который он пытается преобразовать тоже в сообщении об ошибке.
Есть идеи?
Проблема, с которой я сталкиваюсь, заключается в том, что при создании экземпляра IntroState с использованием ссылки GameEngine (как я определил в GameStateBaseClass) я получаю следующую ошибку:
Ошибка 1 ошибка C2664: «IntroState :: IntroState (const IntroState &)»:
невозможно преобразовать параметр 1 из GameEngine в const
Short :: IntroState & '
В GameStateBaseClass я определяю конструктор, который принимает константную ссылку GameState, а в main.cpp я передаю экземпляр игрового движка. С какой стати он пытается преобразовать мой параметр GameEngine в ссылку IntroState?
Вот соответствующий код:
GameStateBaseClass.hpp
class GameStateBaseClass
{
public:
GameStateBaseClass(const GameEngine &instance);
private:
GameStateBaseClass(void); // = delete; // c++1x
GameStateBaseClass(const GameStateBaseClass &instance); // = delete; // c++1x
GameStateBaseClass operator=(const GameStateBaseClass &instance); // = delete; // c++1x
// private members
const GameEngine &game_engine_instance;
}
GameStateBaseClass.cpp
GameStateBaseClass::GameStateBaseClass(const GameEngine &instance)
: game_engine_instance(instance) {
}
// IGameStateInterface.hpp
class IGameStateInterface : GameStateBaseClass
{
public:
virtual void Init() = 0;
virtual void Cleanup() = 0;
... // other virtual void methods...
}
IntroState.hpp
class IntroState : public IGameStateInterface
{
virtual void Init() {}
virtual void Cleanup() { }
// other empty bodies
}
Вот файл движка игры .hpp,
GameEngine.hpp
// forward declaration
class IGameStateInterface;
class GameEngine
{
public:
void Init();
void CLeanup();
void SetState(IGameStateInterface *state);
void AddState(IGameStateInterface *state);
// ... other methods for the engine
};
В моем main.cpp у меня есть следующее:
int main(...) {
GameEngine engine_intance;
// instantiate the engine
engine_instance.Init();
// load the intro state
engine_instance.AddState(new IntroState(engine_instance));
// main loop
....
return 0;
}
Я бы хотел использовать конструктор, который я определил в GameStateBaseClass, тот, который использует константную ссылку GameEngine для создания IntroState, а не тот, который он пытается преобразовать тоже в сообщении об ошибке.
Есть идеи?