c++ constructor using incorrect parameter type to construct object

У меня следующая иерархия:

У меня следующая иерархия:

GameStateBaseClass -> IGameStateInterface -> IntroState

У меня проблема в том, что когда я инстанцирую IntroState, используя ссылку на GameEngine (как я определяю в GameStateBaseClass), я получаю следующую ошибку:

Ошибка 1 ошибка C2664: 'IntroState::IntroState(const IntroState &)' : cannot convert parameter 1 from 'GameEngine' to '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, а не тот, который он пытается преобразовать в сообщении об ошибке.

Есть идеи?

Проблема в том, что когда я создаю IntroState, используя ссылку GameEngine (как я определяю в GameStateBaseClass), я получаю следующую ошибку:

Ошибка 1 ошибка C2664: 'IntroState::IntroState(const IntroState &)' : cannot convert parameter 1 from 'GameEngine' to '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
задан sehe 22 December 2011 в 09:17
поделиться