我正在通过编写游戏来学习C ++。我正在使用SDL显示我的对象和工厂结构,以保持整齐有序。 我将第一个对象(汽车),控件(键盘)和显示器(显示器)分开。 在我的主类中,我调用monitor类来显示一个窗口,我应该在其中绘制图像。如果按下某个键,汽车应该通过重新绘制图像来对此作出反应。 这里的问题是我在主类中初始化了监视器,我无法在我的汽车类中访问它。 我尝试了各种各样的东西,但似乎没有什么可以做到的。
所以这是主要的课程
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)
在您的基类Car
中,您已声明方法turnRight
,其中没有参数。
在派生类SDLCar
中,您声明了一个名称相同的完全不同的方法。它是一个不同的方法而不是函数覆盖的原因是它采用参数。覆盖Car::turnRight
。
因为它不是函数覆盖,所以多态的规则不适用。因此,您无法从SDLCar::turnRight(SDLMonitor&)
指针调用Car
。
现在是开始使用override
keyword的绝佳时机。它特别防止了这种编程错误。通过使用override
标记函数:
void turnRight(SDLMonitor& monitor) override;
编译器会自动检查实际覆盖基类中的函数。
E.g。使用上面的声明,编译器会给你一个错误(或至少一个警告)。这样可以帮助您立即找到错误,并防止更多错误的代码,例如car->turnRight(monitor)
。
现在发现错误,您需要找到一种方法来解决它。要么声明基类turnRight
也需要SDLMonitor&
,要么考虑其他内容,如果它不是它的行为方式。
IMO必须将游戏窗口传递给类似turnRight
的方法,这似乎很奇怪。为什么转车需要窗户?我认为turnRight
应该按照它所说的那样做:把车开好。没别了。
我不知道您为什么要将窗口传递给该方法但是如果它用于绘图,那么drawCar
方法不应该处理该方法吗?我不知道你的代码,所以我会留给你。