2015-03-23 2 views
-1

Я изучаю C++, программируя игру. Я использую SDL для отображения моих объектов и фабричной структуры, чтобы все это было организовано. Я выделил первый объект (автомобиль), элементы управления (клавиатура) и дисплей (монитор). В моем основном классе я вызываю класс монитора, чтобы отобразить окно, в котором я должен рисовать изображения. Если нажата клавиша, автомобиль должен реагировать на это путем перерисовки изображения. Проблема в том, что я инициализировал монитор в основном классе, и я не могу получить к нему доступ в своем классе автомобилей. Я пробовал разные вещи, но ничего похожего на трюк.Пример экземпляра класса C++

Так вот главный класс

Game::Game(GuiFactory* factory) { 

    bool is_running = true; 

    Car* car = factory->createCar(); 
    car->drawCar(); 

    // create factory specific window 
    Monitor* monitor = factory->createMonitor(); 

    // create factory specific keyboard 
    Keyboard* keyboard = factory->createKeyboard(); 

    while (is_running) { 
     // keyboard input 
     string key_input = keyboard->getKeys(); 
     if (key_input == "quit") { 
      is_running = false; 
     } else if (key_input != "") { 
      if(key_input == "right"){ 
       car->turnRight(monitor); 
      } 
     } 
    } 
} 

У меня есть основной класс автомобиля и класс SDLCar, который наследуется автомобиль.

class Car { 
public: 
    Car(); 
    virtual ~Car(); 
    virtual void drawCar() = 0; 
    virtual void turnRight() = 0; 
}; 

Вот где я запутался:

class SDLCar : public Car { 
public: 
    SDLCar(); 
    virtual ~SDLCar(); 
    void drawCar(); 
    void turnRight(SDLMonitor& monitor); 
    //    ^^^^^^^^^^^^^^^^^^^ 
}; 

Может кто-нибудь объяснить?

+0

Монитор является указателем. Разберите его, чтобы получить ссылку. Это проблема? Кстати, как вы удаляете машину? –

+0

'автомобиль-> turnRight (* монитор);' должен делать трюк. –

+0

Неясно, как насчет подчеркнутой линии вызывает путаницу. Это просто, что у вас есть указатель на основную функцию, в то время как метод принимает ссылку, что приводит к ошибкам компилятора? – sth

ответ

0

В вашем базовом классе Car вы объявили метод turnRightкоторый принимает не параметры.

В вашем производном классе SDLCar вы указали совершенно другой метод с тем же именем. Причина, по которой это другой метод, а не функция override, заключается в том, что его значение принимает параметр. Он должен быть без параметров для переопределения Car::turnRight.

И поскольку это не функция переопределения, правила полиморфизма не применяются. Таким образом, вы не можете позвонить SDLCar::turnRight(SDLMonitor&) с указателя .


Прямо сейчас отличное время, чтобы начать использовать override keyword. Это предотвращает подобные ошибки программирования. Выделив функцию с override:

void turnRight(SDLMonitor& monitor) override; 

компилятор автоматически проверит, что она фактически отменяет функции из базового класса.

E.g. с приведенным выше описанием, компилятор даст вам ошибку (или хотя бы предупреждение). Это помогло бы вам сразу найти вашу ошибку и предотвратить более ошибочный код, например car->turnRight(monitor).


Итак, теперь, когда ошибка обнаружена, вам необходимо найти способ ее исправить. Либо объявите базовый класс turnRight, чтобы взять SDLMonitor&, либо подумайте о чем-то другом, если это не так, как должно себя вести.

IMO, которому необходимо передать игровое окно методу turnRight, кажется странным. Почему для поворота автомобиля нужно окно? Я думаю, что turnRight должен делать то, что он говорит на жестяной банке: поверните автомобиль вправо. Ничего больше.

Я не знаю, почему вы передаете окно методу, но если оно предназначено для рисования, не должен ли обрабатываться метод drawCar? Я не знаю вашего кода, поэтому я оставлю его вам.

Смежные вопросы