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++构造函数使用不正确的参数类型来构造对象的主要内容,如果未能解决你的问题,请参考以下文章

c++拷贝构造函数

Cython 和重载的 c++ 构造函数

语言基础:关键字explicit

C++拷贝构造函数:浅拷贝与深拷贝

c++转换构造函数和类型转换函数

C++:调用无参数的构造函数为啥不加括号