1

我是初学者,试图在这个网站上找到答案,但我无法弄清楚如何解决我的特定 C++ OOP 问题。

简短:我想从子类实例访问和更改父类的值,但不知何故,我的方法似乎不起作用。

示例:我的程序中有很多Car实例(使用新构造创建)。如果其中一个Car对象检测到碰撞,则所有Car实例都应反转它们的运动。注册碰撞的Car应该调用父母的ChangeSpeed方法或直接更改speed值。

问题:速度变量似乎没有更新。这个特定的代码/方法有什么问题,还是我必须在其他地方搜索我的问题?

// SpeedControl.h ------------------------------
class SpeedControl
{
public:
    void ChangeSpeed(int);
protected:
    int speed;
};

class Car:
        public SpeedControl
{
public:
    void MoveCar();
    void DetectCollision();

private:
    int position;
};


// SpeedControl.cpp ------------------------------
#include SpeedControl.h

SpeedControl::SpeedControl(void)
{
    speed = 10;
}

SpeedControl::~SpeedControl(void)
{
}

SpeedControl::ChangeSpeed(int _value)
{
    speed *= _value;
}


// Car.cpp ------------------------------
#include SpeedControl.h

Car::Car(void)
{
    position = 100;
}

Car::~Car(void)
{
}

Car::MoveCar()
{
    position += speed; // speed should be accessible?
}

Car::DetectCollision()
{
    speed *= (-1); // inverse speed variable in parent class to inverse direction of ALL cars
    // alternative:
    // ChangeSpeed(-1); // call parent function to inverse speed

}
4

4 回答 4

0

这看起来像是观察者模式是正确解决方案的问题。

于 2013-02-06T12:48:02.220 回答
0

您似乎误解了继承。你需要的是一个静态变量。

在 Car 类中定义静态 int 速度。您可以删除 SpeedControl 类。

于 2013-02-06T12:52:48.680 回答
0

您应该GetSpeed()在您的SpeedControl类中实现 a ,它返回当前速度。

然后你可以在 MoveCar 函数中使用它:

ChangeSpeed(GetSpeed() + GetSpeed());  // Assuming you want to double the speed. 

在你的碰撞中:

ChangeSpeed(-GetSpeed());   

或者,您可以使“ChangeSpeed”成为乘法而不是加法。

于 2013-02-06T12:49:08.573 回答
0

您没有说明您的代码到底出了什么问题,但是从一瞥之下,您正在使用private继承,它将所有父级的成员隐藏在派生类中。

class Child : public Parent { };

上面的行将确保父成员可以从子访问。

于 2013-02-06T12:49:59.430 回答