我是初学者并试图在这个网站上找到答案,但我无法弄清楚如何解决我的特定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
}
答案 0 :(得分:0)
这似乎是observer pattern是正确解决方案的问题。
答案 1 :(得分:0)
您应该在GetSpeed()
班级中实施SpeedControl
,该班级会返回当前的速度。
然后你可以在MoveCar函数中使用它:
ChangeSpeed(GetSpeed() + GetSpeed()); // Assuming you want to double the speed.
并在你的碰撞中:
ChangeSpeed(-GetSpeed());
或者,您可以制作" ChangeSpeed"乘法而不是加法。
答案 2 :(得分:0)
你没有说明你的代码究竟是什么错误,但是通过浏览它,你正在使用private
继承,它将所有父成员隐藏在派生类中。 / p>
class Child : public Parent { };
上面一行将确保可以从Child访问父成员。
答案 3 :(得分:0)
你似乎误解了继承。你需要的是一个静态变量。
在Car类中定义静态int速度。您可以删除SpeedControl类。