传递类实例C ++

时间:2015-03-23 17:03:22

标签: c++

我正在通过编写游戏来学习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);
    //             ^^^^^^^^^^^^^^^^^^^
};

有人可以解释一下吗?

1 个答案:

答案 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方法不应该处理该方法吗?我不知道你的代码,所以我会留给你。