在不调用构造函数的情况下创建 Vector 元素
Creating Vector elements without calling a constructor
假设我有两个类汽车和服务。是否可以为汽车和服务类的两个矢量对象(注意:我不知道是否真的被引用为矢量对象(创建元素。创建两个元素后,我只希望稍后调用汽车类构造函数以调用服务构造函数以获取用户信息?
另外,如果可能的话,是否可以不必将服务构造函数更改为方法?
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
既然我还不能评论你的问题,这是你所期望的吗?
相关文章:
- ";结果类型必须是可从输入范围的值类型""构造的;创建std::vector时
- 如何创建一个类,以便向量工作 std::vector<MyClass<int>> v{ 1,2,3 };
- 创建一个没有复制构造函数的类的 std::vector 的 std::vector
- 为什么 vector 的方法调整大小会创建一个额外的对象?
- 创建一个 const std::vector ,其中包含另一个 const std::vector 和其他值
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- 从函数为 std::vector 创建自定义扩展
- 在从仅移动类型派生的类中定义析构函数在使用 std::vector emplace_back或push_back创建时会
- 动态创建 std::vector 并将其传递给另一个函数的各种方法
- 从函数应用程序创建 std::vector
- 从 std::vector 创建 OpenCV 垫子的有效方法
- 如何创建一个继承自 std::vector 的类
- C - 创建矢量&lt; vector&lt; double&gt;&gt;矩阵具有分配而不是inizializ
- C++ std::vector 创建对象然后添加对象与在向量中创建对象之间的区别?
- 在不调用构造函数的情况下创建 Vector 元素
- 稍后使用<Class>调用类构造函数创建 std::vector
- std::vector::p ush_back(T&&) 在直接传递返回 T&& 的函数时创建默认构造值 T
- 使用 ::std::vector 创建数组
- 为什么"new vector<int>[5]"不创建向量数组?
- 仅使用标准库创建"Vector of References"的标准做法