конструктор c ++, использующий неверный тип параметра для создания объекта - PullRequest
0 голосов
/ 22 декабря 2011

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

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

GameStateBaseClass -> IGameStateInterface -> IntroState

image

Проблема, с которой я сталкиваюсь, заключается в том, что при создании экземпляра 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, а не тот, который он пытается преобразовать тоже в сообщении об ошибке.

Есть идеи?

1 Ответ

6 голосов
/ 22 декабря 2011

Ваш класс IntroState не имеет конструктора, который может принимать аргумент типа GameEngine, поэтому это не удается:

new IntroState(engine_instance)

Конструкторы не наследуются ,поэтому тот факт, что базовый класс GameStateBaseClass имеет такой конструктор, не означает то же самое для IntroState.Вы должны явно написать такой конструктор:

class IntroState : public IGameStateInterface
{
public:
    IntroState(GameEngine & engine) : IGameStateInterface(engine) {}
};

Тогда IGameStateInterface также нужен такой делегирующий конструктор.

Компилятор пытается найти конструктор, который принимает один аргумент, ион находит только один сгенерированный компилятором конструктор копирования IntroState, который имеет такую ​​подпись:

IntroState(const IntroState&)

Отсюда и сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...