创建多个类&amp;的实例将它们存储在vector <class>中

时间:2015-07-16 22:07:12

标签: c++ vector instance

我尝试做的是创建类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) )。

3 个答案:

答案 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);
    }
}