我有一个函数,我想在指向向量中添加指针。
#include "Car.hpp"
using namespace std;
bool CarManagementSystem::addCar(Car::CarType new_car_type) {
if (Car::CarType(new_car_type) == (Invalid)) {
return false;
}
else{
new Car::CarType(new_car_type);
carVector.push_back(Car::CarType(new_car_type));
return true;
}
}
push_back
命令给了我很多悲伤,因为我想要约束的形式。我希望能够使用这个函数来创建不同类型的我的对象Car,不过我是不确定如何做到这一点。
汽车类是我所有不同类型汽车的纯虚拟基类。
#include "Car.hpp"
Car::~Car() {
}
Car::CarType Car::type() const {
return AT_INVALID;
}
class CarSystem {
private:
double Balance;
double CarCost;
std::vector<Car*> carVector;
...
答案 0 :(得分:2)
你的矢量应该是Car *的矢量:
std::vector<Car*> carVector;
向量应填充汽车的具体版本,这意味着从基类Car派生的类:
class Van : public Car
{
...
};
...
Van* newVan = new Van();
carVector.push_back(newVan);
这里Van *也是Car *。 确保在某些时候删除向量的内容,或使用智能指针。
更好的解决方案可能是在Car类中包含一个枚举汽车类型的枚举,然后您不需要处理指针。
答案 1 :(得分:0)
你遇到的麻烦是这段代码片段不符合你的想法:
new Car::CarType(new_car_type);
carVector.push_back(Car::CarType(new_car_type));
第一行创建一个指向新CarType
对象的指针(一个枚举,一个int,我不知道你是如何定义它的)。该指针立即丢失,将导致内存泄漏。
第二行尝试push_back一个CarType
对象,这显然不是指针。
你在代码中缺少的是一个工厂函数,它需要一个CarType
并构建一辆混凝土汽车。在您的代码中,如果Car
是一个无法实例化的抽象类型,或者它是一个在CarType
周围有一些变化的具体类,则不清楚。
如果Car
有一个以CarType
为参数的构造函数,则需要执行以下操作:
bool CarManagementSystem::addCar(Car::CarType new_car_type) {
...
else{
carVector.push_back(new Car(new_car_type));
return true;
}
}
但是如果Car
是一个带派生类的抽象类型,你可以选择以下内容:
bool CarManagementSystem::addCar(Car::CarType new_car_type) {
Car *c;
switch (new_car_type) {
case AT_SUV:
c = new SUV; // if SUV would be a class derived from Car
break;
case AT_RACING_CAR:
...
case AT_INVALID:
default:
return false;
}
carVector.push_back(c);
return true;
}
在这种情况下,您可能会对一个很好的工厂方法模式实现感兴趣,例如this tutorial中解释的那种。