1

私は初心者で、この Web サイトで答えを見つけようとしましたが、特定の C++ OOP 問題を解決する方法を見つけることができませんでした。

短い: サブクラスのインスタンスから親クラスの値にアクセスして変更したいのですが、どういうわけか私のアプローチがうまくいかないようです。

例:Car私のプログラムには多くのインスタンスがあります (新しい構造で作成されました)。オブジェクトの 1 つが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

あなたは相続を誤解しているようです。必要なのは静的変数です。

Carクラスで静的int速度を定義します。SpeedControlクラスを削除できます。

于 2013-02-06T12:52:48.680 に答える
0

これは、オブザーバーパターンが正しい解決策である場合の問題のように見えます。

于 2013-02-06T12:48:02.220 に答える
0

GetSpeed()現在の速度を返すをSpeedControlクラスに実装する必要があります。

次に、これを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 に答える