0

ここで少し問題が発生しました。

  • 車両は親クラスです
  • 車とオートバイは子供クラスです

これは私のメインのcppファイルです

int main() {
    // assuming max size is up to 100
    VehicleTwoD *vehicletwod[100];
    int vehicleCounter = 0;

    Car *car = new Car();
    Motorcycle *motor = new Motorcycle();

    cout << " Please enter name of vehicle ";
    cin >> vehicleName;

    if (vehicleName == "Car") {
        vehicletwod[vehicleCounter] = car;

        //issue here
        vehicletwod[vehicleCounter].setName(vehicleName);
        //issue end

    }

    return 0;
}

これは私のcar.cppです

struct Point {
    int x, y;
};

class Car: public Vehicle {
private:
    Point wPoint[4];
    double area;
    double perimter;
public:
    void setType(string);
    void setPoint();
    string getType();
    string getPoint();
}

ここでの問題は、setNameがVehicleの関数であり、Carの関数ではないことです。しかし、私は関数を継承する必要がある継承を行いました。しかし、うまくいかないようです。

それは言う...非クラスタイプVehicleTwoD*であるVehicletwod[vehicleCounter]'のsetNameの要求

上記の問題は修正されました

追加の問題:

さて、を変更して前の問題を修正しました。〜>

ここで他の問題。

コードがそうであるように。この部分で

 if (vehicleName == "Car") {
            vehicletwod[vehicleCounter] = car;

            vehicletwod[vehicleCounter]->setName(vehicleName);


           //now i want to setPoint which is a function of child class
           vehicletwod[vehicleCounter]->setPoint();
           //issue here
        }

子クラスCarの関数であるsetPointを試してみます

ただし、車両には「setPoint」という名前のメンバーがありません。

ジョンが言ったことをした後..上記の問題も修正されました..

しかし、最も難しいのは、車のオブジェクトではなく、Vehicletwodオブジェクトであるため、設定されたものを取得する方法です。

setPointの後で、getPoint()を取得したいとします。

私はこれをやってみます

Vehicletwod [0]-> getPoint();

getPointが非クラスタイプの「vehicletwod」であるというエラーが表示されます

4

5 に答える 5

2

OKはまだ何VehicleTwoDであるかわかりませんが、あなたが書いた場合、あなたはより正確になります

vehicletwod[vehicleCounter]->setName(vehicleName);

それ以外の

vehicletwod[vehicleCounter].setName(vehicleName);

ポインタの配列があるので、を使用する必要があります->

もう1つの問題は、、setPointのメンバーにすぎないため、配列に追加する前に車で呼び出す必要があることです。Carnot Vehicle

このようなもの

if (vehicleName == "Car") {
    car->setPoint();
    vehicletwod[vehicleCounter] = car;
    vehicletwod[vehicleCounter]->setName(vehicleName);
}
于 2012-10-26T17:34:29.550 に答える
0

車とオートバイを異なる方法でインスタンス化する必要があります。

VehicleTwoD *car = new Car();
VehicleTwoD *motor = new Motorcycle();

次に、子クラスで使用するメソッドを保護対象として宣言します。

どういたしまして!

PD:車はVehicleTwoDではありません、分類法は重要です。

于 2012-10-26T17:36:02.840 に答える
0

Vehicletwod [vehicleCounter]はポインターなので、逆参照する必要があります。Vehicletwod [vehicleCounter]-> setName(vehicleName)を試してください。

あなたはポインタを読みたいかもしれません。Googleの「c++クラスポインタの基本」またはチェックアウトhttp://www.codeproject.com/Articles/627/A-Beginner-s-Guide-to-Pointers

于 2012-10-26T17:43:04.203 に答える
0

likにVehicleTwoDは次のようなメソッドがないようです。

protected:
virtual void setPoint();

配列の定義のためにこれが必要です。

于 2012-10-26T17:44:37.947 に答える
0

VehicleTwoDにはsetPoint()がないため、VehicleTwoD*をCar*にdynamic_castする必要がありますが、Vehicletwod [vehicleCounter]が実際にCarのオブジェクトを指していることを確認する必要があります。そうでない場合、ランタイムエラーになります。

dynamic_cast<Car*>(vehicletwod[vehicleCounter])->setPoint();

最良の方法は、setPoint()をVehicleTwoDの純粋仮想関数として作成することです。

class VehicleTwoD {
public:
    virtual void setPoint() = 0;
    /***/
};

派生クラスにsetPoint()を実装します。

于 2012-10-26T17:49:12.963 に答える