我在这里遇到了一些问题。
这是我的主要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 [vehicleCounter]中请求setName'是非类型的VehicleTwoD *
以上问题已修复
附加问题:
好的,我通过更改修复了上一期。到 - &gt;
这是另一个问题。
代码是。在这一部分
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
}
我尝试将setPoint作为子类的函数,Car
然而它说..车辆没有名为'setPoint'的成员
在做约翰提到之后......上述问题也已修复..
但最困难的部分是如何检索已设置的内容,因为它是一个车辆对象,而不是汽车对象。
假设在setPoint之后,我想要getPoint()
我尝试这样做
vehicletwod [0] - &GT;用GetPoint();
我收到一条错误,说getPoint属于非类型'vehicletwod'
答案 0 :(得分: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);
}
答案 1 :(得分:0)
您必须以不同方式实例化汽车和摩托车:
VehicleTwoD *car = new Car();
VehicleTwoD *motor = new Motorcycle();
然后将要在子类中使用的方法声明为protected。
欢迎你!
PD:汽车不是VehicleTwoD,分类学很重要。答案 2 :(得分:0)
vehicletwod [vehicleCounter]是一个指针,因此您需要取消引用它。试试vehicletwod [vehicleCounter] - &gt; setName(vehicleName)。
您可能想要阅读指针。谷歌“c ++类指针基础”或结帐http://www.codeproject.com/Articles/627/A-Beginner-s-Guide-to-Pointers
答案 3 :(得分:0)
似乎VehicleTwoD
似乎没有这样的方法:
protected:
virtual void setPoint();
由于数组的定义,你需要这个。
答案 4 :(得分:0)
VehicleTwoD没有setPoint(),所以你必须将VehicleTwoD *动态播放到Car *,但你必须确保vehicletwod [vehicleCounter]真正指向Car的对象,否则它是运行时错误!
dynamic_cast<Car*>(vehicletwod[vehicleCounter])->setPoint();
最好的方法是将setPoint()作为VehicleTwoD的纯虚函数;
class VehicleTwoD {
public:
virtual void setPoint() = 0;
/***/
};
在派生类中实现setPoint()。