我有以下层次结构:
我有以下层次结构:
GameStateBaseClass -> IGameStateInterface -> IntroState
我遇到的问题是当我使用GameEngine引用实例化IntroState时(我在GameStateBaseClass中定义)我收到以下错误:
错误1错误C2664:'IntroState :: IntroState(const IntroState&)': 不能将参数1从'GameEngine'转换为'const Short :: IntroState&'
在GameStateBaseClass中,我定义了一个带有const 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中定义的构造函数,该构造函数采用const GameEngine引用来构造IntroState,而不是它在错误消息中尝试转换的那个。
有什么想法吗?
我遇到的问题是当我使用GameEngine引用实例化IntroState时(我在GameStateBaseClass中定义)我收到以下错误:
错误1错误C2664:'IntroState :: IntroState(const IntroState&)': 不能将参数1从'GameEngine'转换为'const Short :: IntroState&'
在GameStateBaseClass中,我定义了一个带有const 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中定义的构造函数,该构造函数采用const GameEngine引用来构造IntroState,而不是它在错误消息中尝试转换的那个。
有什么想法吗?
答案 0 :(得分:6)
您的班级IntroState
没有可以接受GameEngine
类型参数的构造函数,因此失败了:
new IntroState(engine_instance)
Constructors are not inherited,因此基类GameStateBaseClass
具有这样的构造函数这一事实并不意味着IntroState
。你必须明确地编写这样的构造函数:
class IntroState : public IGameStateInterface
{
public:
IntroState(GameEngine & engine) : IGameStateInterface(engine) {}
};
然后,IGameStateInterface
也需要这样的委托构造函数。
编译器尝试查找带有一个参数的构造函数,并且它找到的唯一一个是编译器生成的IntroState
的复制构造函数,它具有以下签名:
IntroState(const IntroState&)
因此出现错误信息。