我尝试做的是创建类Point
的多个实例,并访问每个实例的类变量。
class Point
{
public:
float x, y, z;
};
在下面的main()程序中,我创建了一个名为point_的单个Point
实例,并在向量中多次推送同一个实例。
int main()
{
std::vector < Point > vect;
Point point_;
int num_instances; // is user defined
for (int i = 0; i < num_instances; i++)
{
vect.push_back(point_); // (^^^)
}
}
(^^^)这里,问题是这个Poin
类型的向量,它正在添加我手动创建的1个单个实例(称为point_)。 我想要的是基于用户输入的num_instances(比如5),应该创建相同数量(即5个)的Point
类型实例并将其存储在此向量中(称为vect) )。
答案 0 :(得分:4)
在下面的main()程序中,我创建了一个Point类型的实例,称为point_,并在向量中多次推送同一个实例。
是的,您正在创建名为Point
的{{1}}类型的单个实例。不,你没有在向量中多次推送同一个实例。
如果您将同一个实例多次推送到向量中,则意味着该实例同时位于多个位置。这不可能发生。我将使用物理纸质文档的类比。如果您想多次将此文档放入一堆文档中,则必须复制它。您的point_
对象也是如此。
当您在向量上调用Point
时,它会为push_back
分配内存并将给定的Point
对象复制到该内存中。因为它会为向量中的每个项目分配完全独立的内存块,所以它们不可能是同一个对象。
修改:此处的证明:http://ideone.com/F5XX4u
答案 1 :(得分:1)
push_back方法会复制您推送的项目。为了证明这一点,当您运行以下代码时
#include "stdio.h"
#include "stdlib.h"
#include "math.h"
#include <vector>
class Point
{
public:
float x, y, z;
};
int main()
{
std::vector < Point > vect;
Point point_;
int num_instances = 5; // is user defined
for (int i = 0; i < num_instances; i++)
{
vect.push_back(point_); // (^^^)
}
for (int i = 0; i < num_instances; i++){
printf(" %d: %x\n", i, &(vect[i]) );
}
}
您将获得以下输出:
0: fbd00060
1: fbd0006c
2: fbd00078
3: fbd00084
4: fbd00090
这意味着向量中的每个对象都是不同Point对象的实例。如果它们是同一个实例,那么它们都将具有相同的地址
答案 2 :(得分:0)
而不是使用push_back
,它执行以下操作:
将给定的元素值追加到容器的末尾。
1)新元素初始化为值的副本。
2)将值移入新元素。
你可以使用emplace_back
,它从参数构造一个全新的对象并将其附加到矢量。
你可以像这样使用它:
int main()
{
std::vector < Point > vect;
int num_instances; // is user defined
for (int i = 0; i < num_instances; i++)
{
// You should use the values you want here
float x = 0.0f;
float y = 0.0f;
float z = 0.0f;
vect.emplace_back(x, y, z);
}
}