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;
}

这是我的车.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[vehicleCounter]' 中请求 setName,它是非类类型 VehicleTwoD*

以上问题已修复

附加问题:

好的,我通过更改修复了上一个问题。到->

这里是另一个问题。

就像代码一样。在这部分

 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”的成员

在做了约翰提到的事情之后..上述问题也得到了解决..

但最困难的部分是如何检索设置的内容,因为它是一个车辆对象而不是汽车对象。

假设在 setPoint 之后,我想 getPoint()

我试着这样做

vehicletwod[0]->getPoint();

我收到一条错误消息,说 getPoint 属于非类类型“vehicletwod”

4

5 回答 5

2

好的,仍然不知道是什么VehicleTwoD,但如果你写的话,你会更接近正确

vehicletwod[vehicleCounter]->setName(vehicleName);

代替

vehicletwod[vehicleCounter].setName(vehicleName);

你有一个指针数组,所以你需要使用->.

另一个问题是它setPoint只是 , 的成员Car,因此在将它添加到数组之前not Vehicle,您必须在汽车上调用它。

像这样的东西

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

您必须以不同的方式实例化 Car 和 Motorcycle:

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

然后将要在子类中使用的方法声明为受保护。

不客气!

PD:汽车不是 VehicleTwoD,分类很重要。

于 2012-10-26T17:36:02.840 回答
0

vehicletwod[vehicleCounter] 是一个指针,因此您需要取消引用它。试试 vehicletwod[vehicleCounter]->setName(vehicleName)。

您可能想阅读指针。谷歌“c++ 类指针基础”或结帐http://www.codeproject.com/Articles/627/A-Beginner-s-Guide-to-Pointers

于 2012-10-26T17:43:04.203 回答
0

似乎VehicleTwoD没有这样的方法:

protected:
virtual void setPoint();

由于数组的定义,您需要它。

于 2012-10-26T17:44:37.947 回答
0

VehicleTwoD 没有 setPoint(),所以必须将 VehicleTwoD * 动态转换为 Car*,但必须确保 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 回答