在不调用构造函数的情况下创建 Vector 元素

Creating Vector elements without calling a constructor

本文关键字:创建 Vector 元素 情况下 调用 构造函数      更新时间:2023-10-16

假设我有两个类汽车和服务。是否可以为汽车和服务类的两个矢量对象(注意:我不知道是否真的被引用为矢量对象(创建元素。创建两个元素后,我只希望稍后调用汽车类构造函数以调用服务构造函数以获取用户信息?

另外,如果可能的话,是否可以不必将服务构造函数更改为方法?

   using namespace std; // I know this is not the best, prof wants us to use it
   class Car { Car() { //Get data from user } };
   class Service { Service(){ //Get data from user } };
   int main () {
       int num;
       vector<Car> car; 
       vector<Service> service;
       car.push_back(Car{});
       service.push_back();
       for (int i = 0; i < car.size(); i++) 
            car[i].display(i);
       cout << endl << car.size() + 1 << ". exit";
       cin >> num;
       service[num].Service::Service();
   }

我建议使用std::map而不是std::vector你的任务自然会做出的选择。通过使用它,您将仅存储有效的服务元素。

   map<int,Service> service;
   car.push_back(Car{});
   for (int i = 0; i < car.size(); i++) 
        car[i].display(i);
   cout << endl << car.size() + 1 << ". exit";
   cin >> num;
   service[num]; //Service constructor will be called

我想你正在寻找这样的东西:

class Car {
private:
    std::string _make;
    std::string _model;
    std::string _vinNumber;
    std::size_t _year;
public:
    Car() : _year( 0 ) {} // default
    Car( const std::string& make, const std::string& model, 
         const std::string& vinNumber, const std::size_t& year ) :
      _make( make ), _model( model ), 
      _vinNumber( vinNumber ), _year( year ) {
    }
    void setCarInfo( const std::string& make, const std::string& model,
                     const std::string& vinNumber, const std::size_t& year ) {
        _make      = make;
        _model     = model;
        _vinNumber = vinNumber;
        _year      = year;
    }
    std::string makeOf() const { return _make; }
    std::string modelOf() const { return _model; }
    std::string vinNumberOf() const { return _vinNumber; }
    std::size_t yearOf() const { return _year; }
};
class Service {
private:
    std::string _dealership;
    std::size_t _currentMiles;
public:
    Serivce() {}
    std::string dealershipOf() const { return _dealership; }
    std:size_t  currentMilesOf() const { return _currentMiles; }
    void setOrChangeDealership( const std::string& dealership ) {
        _dealership = dealership;
    }
    void setOrChangeCurrentMiles( std::size_t miles ) {
        _currentMiles = miles;
    }
    void setOrChangeCurrentMiles( const std::size_t& miles ) {
        _currentMiles = miles;
    }
};
int main() {
    std::vector<Car> cars;
    std::vector<Service> services;
    // you can add Car to vector by either default constructor 
    // to be filled out later or by user defined constructor
    cars.push_back( Car( "Honda", "Civic", "75273250323XMD252AG9", 2017 ) );
    // or
    cars.push_back( Car() );
    // then you can at some point in time update elements in container
    cars[i].setCarInfo( "Dodge", "Charger", "9259356M325D2680A217B", 2015 );
    // As with the service class there is only a "default" constructor
    services.push_back( Service() );
    // Service's members will have to be updated manually and later.
    return 0;
}

无论您使用什么容器,或者即使您有一个类对象的单个实例,都将调用该类的CTOR。唯一的方法是,如果 A: 您将其声明为 protected 或在类中private阻止声明与继承和多态一起使用的类,或者如果您将构造函数声明为已删除的函数:SomeClass() = delete .没有办法让类实例不由编译器隐式调用或由您显式调用其构造函数。

即使是这样简单的事情:

class A {
public:
    int x;
};
int main() {
   A a;
   a.x = 5;
   return 0;
}

该行A a;编译器将在a上调用A()幕后面,因此它实际上如下所示:

 A a();

使用其默认构造函数。

从 C++11 开始,您拥有 vector 和其他容器的列表初始化。

http://en.cppreference.com/w/cpp/language/list_initialization

这意味着,您可以在初始化时将元素枚举放在向量中。

您可以在其中使用自己的类构造函数:

std::vector<Car> cars {Car(...), Car(...), Car(...)}; //C++11

既然我还不能评论你的问题,这是你所期望的吗?