使用指向具有指针c ++的对象的指针向量

时间:2013-10-27 09:24:26

标签: c++ pointers

我有一个循环,它添加了一个向量的指针;

vector<Material *> materials;

我的Material类有4个属性:

int id;
float *ambiance;
float *diffuse;

在我的循环中:

while(input_read_from_the_file !=NULL){
int id=someval1;
float x[2]={someval2,someval3};
float y[2]={someval4,someval5};
materials.push_back(new Material(id,x,y));
}

当我在for循环中读取我的材质向量时,我看到id是不同的,但是所有元素的氛围和漫反射都是相同的。这可能是因为它在while循环中使用相同的指针,但我无法找到替代方法。应该是最好的方法吗? 感谢

1 个答案:

答案 0 :(得分:1)

我尽量避免使用指针。 让我们从你的向量开始吧。为什么需要vector<Material*>而不是vector<Material>? 除非Material是继承的类,否则可以使用Material个对象的向量而不是指针。 这样,你不需要具有vector<Material*>的类的析构函数来迭代和销毁它们(通过使用shared_ptr,你也可以避免这种情况。)

现在,正如评论中所提到的,问题是Material使用ambiancediffuse成员的指针。也没理由。 从技术上讲,当您编写渲染器或材质系统时,您希望它为Vector3Vector4,但请改为使用float[2]

C ++ 11(0x)具有很酷的移动语义,您可以使用它来避免创建临时对象(因为我们要将对象推入向量而没有移动语义,因此创建了一个临时对象这样做)

因此,您的代码如下:

class Material {
int id;
float ambiance[2]; // you really ought to use Vector2 instead. pointers are evil.
float diffuse[2];

Material (const int _id, const float _amb[], const float _dif[]) : id(_id) {
   ambiance[0] = _amb[0]; ambiance[1] = _amb[1]; // actual copy is made
   diffuse[0]  = _dif[0]; diffuse[1]  = _dif[1]; 
}
}

-----
vector<Material> materials;

while(input_read_from_the_file !=NULL){
   int id    = someval1;
   float x[2]= {someval2,someval3};
   float y[2]= {someval4,someval5};
   materials.emplace_back(Material(id,x,y)); // or even materials.emplace_back(id, x, y);
}