-1

C++配列を使用してクラスにサブクラスを作成する方法

こんにちはみんな、私はまだC ++を学んでいて、ここでいくつかの問題に直面しています。

基本的に私は親クラスを取得しました

この親クラスを次のように呼び出しましょう

Vehicle

2つのサブクラスがあります。

Car and Motorcycle

車両サイズが20であると仮定して車両オブジェクトを作成します

Vehicle veh[20]

私は次のことをします

string vType;

cout << "Please enter your vehicle Type:";
cin >> vType;

だから私は(vType == "Car")の場合に比較を行います

サブクラスから4つのホイールを返しますが、Carで4つのホイール、Motorcycleで2つのホイールを宣言するにはどうすればよいですか、2つの追加のcppファイルを作成する必要があります。

class Car : public Vehicle
{
private:
int noOfWheels;
public:
computePrice();
}

しかし、noOfWheelsを特別にCarを4に、Motorcycleを2に設定するにはどうすればよいですか。

次はトリッキーな部分です..それがいくつのホイールであるかを知った後

ホイールごとに配列を保存する必要があります

string wheel[4];

私は車に4輪があることを知っているので。

4タイプをプロンプトして配列に格納し、これらすべてをオブジェクト呼び出しVehicleに格納するにはどうすればよいですか。

forループを使用できますが、それは問題ではありません。私が立ち往生しているのは、文字列配列を作成し、4プロンプトを格納してから、このVehicle[0]に格納する方法です。

wheel 1:
wheel 2:
wheel 3:
wheel 4:

ユーザーがデータを印刷したい場合は

Vehicle[0]
Type: Car
Wheel: 4
Wheel[0] = Fine condition
Wheel[1] = Need to check again
Wheel[2] = Fine condition
Wheel[3] = Might need get repair

すべての助けをありがとう。

4

2 に答える 2

3

回答は受理されたようですが、全部入力したので全部投稿します。それは私が推測するOOPの要約です。

すべての車両に車輪があると仮定しましょう。それらすべてのホイールには状態があります。一部の車両は他の車両よりも多かれ少なかれ車輪を持っています。

クラスの共通の側面をより高い順序に、基本クラスに分離する必要があります。

また、クラスを編成して、他のクラスと組み合わせて全体を構築する必要があります。

ここにホイールクラスconditionがあり、文字列であるがあります。いつでもその状態を照会できます。

class Wheel 
{
  public:
    const std::string GetCondition() const { return mCondition; }
  private:
    std::string mCondition;
};

車両には車輪が付いていることがわかっているので、ここに車輪コンテナを格納して、継承を通じて子クラス間で共有します。

class Vehicle
{
  public:
    Vehicle(unsigned int wheelCount) { mWheels.resize(wheelCount, Wheel()); }
    virtual unsigned int GetWheelCount() { return mWheels.size(); }
    virtual const std::string GetWheelCondition(int wheelNumber)
    {
      return mWheels[wheelNumber].GetCondition();
    }
  protected:
    std::vector<Wheel> mWheels; // All vehicles have wheels.
};

車はの一種ですVehicle。したがって、から継承Vehicleます。オブジェクトを保持するメンバーを継承していWheelます。また、ホイール数を検索し、インデックスによってホイールのステータスを取得するのに役立つメソッドを継承しています。これは、クラスを専門化できるレベルです。CarとクラスのMotorbike両方にホイールがあり、同じコア機能があります。メソッドを追加またはオーバーロードすることで、クラスを特殊化できます。

class Car : public Vehicle
{
  public:
    Car() Vehicle(4) {}
    Car(unsigned int wheelCount) : Vehicle(wheelCount) {}
}

class Motorbike : public Vehicle
{
  public:
    MotorBike(unsigned int wheelCount) : Vehicle(wheelCount) {}
    void DoWheelie() { throw; }
}

これらのオブジェクトをこのように使用できます。

Car car(4); // Car with 4 wheels. specialized constructor.
Car standardCar(); // Car with 4 wheels, as default constructor.
Car uberCar(42); // Car with 42 wheels.    
Motorbike bike(2); // Bike with 2 wheels.
Motorbike badBike(); // No default constructor defined! Will not compile!

car.GetWheelCount(); // 4
bike.GetWheelCount(); // 2

bike.DoWheelie(); // All good.
car.DoWheelie(); // NOPE! Method doesn't exist for this.

ポリモーフィズムとヒープ割り当ての利点についてはまだまだ言いたいことがありますが、ここではそのままにしておきます。お役に立てば幸いです。

于 2012-10-25T09:47:05.687 に答える
3

まず、配列の宣言が間違っています。多態的なクラスを扱っているので、ポインタを使用する必要があります。

Vehicle* veh[20];

それ以外の場合は、オブジェクトスライシングと呼ばれるものがあります。つまり、Carまたはを作成した場合でも、それらを配列に割り当てると、それらMotorcycleはsに変換されます。Vehicle

「noOfWheelsを特別にCarを4に、Motorcycleを2に設定するにはどうすればよいですか。」

コンストラクター内

class Car : public Vehicle
{
public:
    Car() : noOfWheels(4) { ... }
private:
    int noOfWheels;
    ...
};

class Motorcycle : public Vehicle
{
public:
    Motorcycle() : noOfWheels(2) { ... }
private:
    int noOfWheels;
    ...
};

しかし、個人的には、noOfWheelsデータメンバーはまったく必要ないと思います。車両の種類ごとに車輪の数が固定されているため、スペースの無駄になります。代わりに、仮想関数が必要です。

class  Vehicle
{
public:
    virtual int noOfWheels() const = 0;
    ...
};

class Car : public Vehicle
{
public:
    virtual int noOfWheels() const { return 4; }
    ...
};

class Motorcycle  : public Vehicle
{
public:
    virtual int noOfWheels() const { return 2; }
    ...
};

「文字列配列を作成し、4プロンプトを保存してから、このVehicle[0]に保存するにはどうすればよいですか?」

ここでも、コンストラクターを使用して車のホイール名を初期化します。

class Car : public Vehicle
{
public:
    Car(const std::string* w)
    { wheel[0] = w[0]; wheel[1] = w[1]; wheel[2] = w[2]; wheel[3] = w[3]; }
    virtual int noOfWheels() const { return 4; }
private:
    std::string wheel[4];
    ...
};

コンストラクターを使用してクラスを初期化します。それが彼らの目的です。

于 2012-10-25T09:22:48.107 に答える