我想做类似的事情:
class Circle {
int radius;
public:
Circle( int r ) : radius(r) {}
}
vector<Circle> circlesVector;
for (int i = 0; i < 10; i++) {
Circle circle(i);
circlesVector.push_back(circle);
}
但这似乎并不像我想要的那样有效。向量尝试使用Circle(Circle&amp;)的构造函数或某些我不理解或期望的行为来创建Circle对象。
答案 0 :(得分:9)
您发布的代码基本上没问题,只有一些拼写错误和遗漏包含。您可以看到this working demo。
但您不需要创建临时Circle
对象。你可以这样做:
for (int i = 0; i < 10; i++) {
circlesVector.push_back(i);
}
因为Circle
可以隐式构建int
。
请注意,您还可以使用初始化列表:
vector<Circle> circlesVector{0,1,2,3,4,5,6,7,8,9};
或者,使用emplace_back
:
circlesVector.emplace_back(i);
答案 1 :(得分:3)
Class Circle有一个转换构造函数,它将int类型的对象转换为Circle类型的对象:
Circle( int r ) : radius(r) {}
所以你可以使用这个构建向量的事实
for (int i = 0; i < 10; i++) {
circlesVector.push_back( i );
}
答案 2 :(得分:1)
你可以利用你提供的转换构造函数,因此Circle
可以隐式构造int
:
for (int i = 0; i < 10; i++) {
circlesVector.push_back(i);
}
会没事的。但是,如果构造函数中有许多变量,您可以使用ie std::transform
:
Circle initC ( Circle c) {
static int i = 0;
return Circle(i++); // copy assignment operator
} // will be used to assign new Circle into default
// version of Circle present already in vector
int main(int argc, char *argv[])
{
std::vector<Circle> cVec(10);
std::transform( cVec.begin(), cVec.end(),
cVec.begin(), initC);
return 0;
}
答案 3 :(得分:0)
你也可以通过创建一个临时的半径矢量来完成所有这些操作:
class Circle
{
private:
int radius;
public:
Circle( int r ) : radius(r) {}
int GetRadius() const { return radius; }
};
int main()
{
std::vector<int> radii(10); // vector to hold your radiuses
std::iota(radii.begin(), radii.end(), 0); // initialize them to the desired sizes
std::vector<Circle> circles(radii.begin(), radii.end()); // use your conversion constructor
for (std::size_t i = 0; i < circles.size(); ++i)
{
std::cout << "Circle[" << i << "] radius = " << circles[i].GetRadius() << "\n";
}
return 0;
}
答案 4 :(得分:0)
“向量尝试使用Circle(Circle&amp;)的构造函数或某些我不理解或期望的行为来创建Circle对象。” STL容器(至少使用C ++ 98)复制您添加到它们的构造对象。