Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何格式化指针上的push_?_C++_Pointers_Polymorphism - Fatal编程技术网

C++ 如何格式化指针上的push_?

C++ 如何格式化指针上的push_?,c++,pointers,polymorphism,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

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

#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
命令让我非常难过,因为我希望约束采用什么形式。我希望能够使用此功能创建不同类型的我的目标车,但我不确定如何做到这一点

汽车类是我所有不同类型汽车的纯虚拟基类

#include "Car.hpp"

Car::~Car() {
}

Car::CarType Car::type() const {
    return AT_INVALID;
}



class CarSystem {
private:
    double Balance;
    double CarCost;
    std::vector<Car*> carVector; 
...
#包括“Car.hpp”
汽车::~Car(){
}
Car::CarType Car::type()常量{
返回时无效;
}
等级制{
私人:
双平衡;
双重成本;
std::向量向量向量机;
...

你的向量应该是Car*的向量:

std::vector<Car*> carVector;
这里的Van*也是一辆车*。 确保在某个点删除向量的内容,或使用智能指针


一个更好的解决方案可能是在Car类中有一个enum来声明Car的类型,然后您就不需要处理指针了。

您遇到的问题是,这个代码片段不符合您的想法:

   new Car::CarType(new_car_type);
   carVector.push_back(Car::CarType(new_car_type));
  • 第一行创建了一个指向新的
    CarType
    对象的指针(一个enum,一个int,我不知道您是如何定义它的)。这个指针会立即丢失并导致内存泄漏

  • 第二行尝试将
    CarType
    对象推回,该对象显然不是指针

代码中缺少的是一个工厂函数,它采用
CarType
并构造一个具体的car。在代码中不清楚
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;
}

在这种情况下,您可能会对一个很好的工厂方法模式实现感兴趣,如中所述。

首先,您确定需要一个指针吗?其次,听起来您需要一个指针来学习C++的正确语法。这段代码非常奇怪-例如,
new Car::CarType(new\u Car\u type)的唯一用途是创建内存泄漏。请尝试创建一个并显示给我们。包括“代码”(至少声明)的代码> CARVATION/CODE >。看来您仍在学习C++的基础知识。您可能需要抓住A来掌握基础知识。您应该在<代码> PUBSUBF()中拥有<代码>新< /代码>。
,而不是外部。您也可能有一个
std::vector
,而不必担心指针。“一个更好的解决方案可能是在Car类中有一个枚举,用于说明Car的类型,”这是否更好还有争议。将原始指针存储在
向量
中肯定不好,应该是
std::vector
std::vector
。我提到了智能指针的使用。在我们没有太多信息的情况下,很难给出具体的建议。
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;
}