我有一个循环,它添加了一个向量的指针;
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循环中使用相同的指针,但我无法找到替代方法。应该是最好的方法吗? 感谢
答案 0 :(得分:1)
我尽量避免使用指针。
让我们从你的向量开始吧。为什么需要vector<Material*>
而不是vector<Material>
?
除非Material
是继承的类,否则可以使用Material
个对象的向量而不是指针。
这样,你不需要具有vector<Material*>
的类的析构函数来迭代和销毁它们(通过使用shared_ptr
,你也可以避免这种情况。)
现在,正如评论中所提到的,问题是Material
使用ambiance
和diffuse
成员的指针。也没理由。
从技术上讲,当您编写渲染器或材质系统时,您希望它为Vector3
或Vector4
,但请改为使用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);
}