c++构造函数使用不正确的参数类型来构造对象
Posted
技术标签:
【中文标题】c++构造函数使用不正确的参数类型来构造对象【英文标题】:c++ constructor using incorrect parameter type to construct object 【发布时间】:2011-12-22 08:49:49 【问题描述】:我有以下层次结构:
我有以下层次结构:
GameStateBaseClass -> IGameStateInterface -> IntroState
我遇到的问题是,当我使用 GameEngine 引用(正如我在 GameStateBaseClass 中定义的那样)实例化 IntroState 时,出现以下错误:
错误 1 错误 C2664: 'IntroState::IntroState(const IntroState &)' : 无法将参数 1 从“GameEngine”转换为“const” 短::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 文件, 游戏引擎.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 引用(正如我在 GameStateBaseClass 中定义的那样)实例化 IntroState 时,出现以下错误:
错误 1 错误 C2664: 'IntroState::IntroState(const IntroState &)' : 无法将参数 1 从“GameEngine”转换为“const” 短::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 文件, 游戏引擎.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,而不是它在错误消息中也尝试转换的构造函数。
有什么想法吗?
【问题讨论】:
您没有IntroState::IntroState(GameEngine&)
或类似名称。那么new IntroState(engine_instance)
应该如何工作?
你的问题有点乱,包括10个不同的代码sn-ps。您应该尝试将问题提取到最小场景,否则可能在必要时使用 gist 发布源(最好是可编译的),如下所示:gist.github.com/1509689
【参考方案1】:
您的类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&)
因此出现错误消息。
【讨论】:
嗯,我不知道构造函数没有被继承!以上是关于c++构造函数使用不正确的参数类型来构造对象的主要内容,如果未能解决你的问题,请参考以下文章