如何在指针上格式化push_back?

时间:2016-08-18 12:03:22

标签: c++ pointers polymorphism

我有一个函数,我想在指向向量中添加指针。

#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; 
...

2 个答案:

答案 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中解释的那种。