在不调用构造函数的情况下创建 Vector 元素
Creating Vector elements without calling a constructor
假设我有两辆 classes 汽车和服务。是否可以为汽车和服务的两个矢量对象(注意:我不知道是否实际上被称为矢量对象)创建元素 classes。一旦创建了两个元素,我只希望稍后调用 car class 构造函数来调用服务构造函数来获取用户信息?
此外,如果可能,是否可以不必将服务构造函数更改为方法?
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();
}
从 C++11 开始,您可以使用 list-initialization 用于向量和其他容器。
http://en.cppreference.com/w/cpp/language/list_initialization
这意味着,您可以在初始化时将元素枚举放入向量中。
您可以在其中使用自己的 class 构造函数:
std::vector<Car> cars {Car(...), Car(...), Car(...)}; //C++11
由于我还不能评论你的问题,这是你所期望的吗?
我建议使用 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;
}
无论您使用什么容器,或者即使您只有一个 class 对象实例; class 的 CTOR
将被调用。唯一不会的方法是 A:您在 class 中将其声明为 protected
或 private
阻止声明与继承一起使用的 class和多态性,或者如果您将构造函数声明为已删除的函数:SomeClass() = delete
。没有编译器隐式调用或您显式调用其构造函数的情况下,不可能有一个 class 实例。
甚至像这样简单的事情:
class A {
public:
int x;
};
int main() {
A a;
a.x = 5;
return 0;
}
A a;
行在后台编译器将在 a
上调用 A()
所以它实际上看起来像这样:
A a();
使用它的默认构造函数。
假设我有两辆 classes 汽车和服务。是否可以为汽车和服务的两个矢量对象(注意:我不知道是否实际上被称为矢量对象)创建元素 classes。一旦创建了两个元素,我只希望稍后调用 car class 构造函数来调用服务构造函数来获取用户信息?
此外,如果可能,是否可以不必将服务构造函数更改为方法?
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();
}
从 C++11 开始,您可以使用 list-initialization 用于向量和其他容器。
http://en.cppreference.com/w/cpp/language/list_initialization
这意味着,您可以在初始化时将元素枚举放入向量中。
您可以在其中使用自己的 class 构造函数:
std::vector<Car> cars {Car(...), Car(...), Car(...)}; //C++11
由于我还不能评论你的问题,这是你所期望的吗?
我建议使用 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;
}
无论您使用什么容器,或者即使您只有一个 class 对象实例; class 的 CTOR
将被调用。唯一不会的方法是 A:您在 class 中将其声明为 protected
或 private
阻止声明与继承一起使用的 class和多态性,或者如果您将构造函数声明为已删除的函数:SomeClass() = delete
。没有编译器隐式调用或您显式调用其构造函数的情况下,不可能有一个 class 实例。
甚至像这样简单的事情:
class A {
public:
int x;
};
int main() {
A a;
a.x = 5;
return 0;
}
A a;
行在后台编译器将在 a
上调用 A()
所以它实际上看起来像这样:
A a();
使用它的默认构造函数。