0

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

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 循环中使用相同的指针,但我找不到替代方法。应该是什么这里最好的方法?谢谢

4

1 回答 1

1

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

现在,正如评论中提到的,问题在于Material使用ambiancediffuse成员的指针。也没有理由。从技术上讲,您希望它是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);
}
于 2013-10-27T09:47:00.660 回答