У меня есть цикл, который добавляет указатели на вектор;
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, я вижу, что идентификаторы различны, но атмосфера и диффузия одинаковы для всех элементов. Возможно, потому, что он использует один и тот же указатель в цикле while, но я не мог найти альтернативу. Каким должен быть лучший подход здесь? благодаря
Я стараюсь избегать указателей, насколько смогу. Начните с вашего вектора. Почему он должен быть vector<Material*>
а не vector<Material>
? Если Material
не является наследуемым классом, вы можете использовать вектор объектов Material
вместо указателей. Таким образом, вам не нужен деструктор класса, у которого есть vector<Material*>
для итерации и уничтожения каждого из них (с помощью shared_ptr
вы также можете избежать этого).
Теперь, как упоминалось в комментариях, проблема заключается в том, что в Material
используются указатели на ambiance
и diffuse
элементы. Нет причин для этого. Технически вы хотите, чтобы это было Vector3
или Vector4
при написании рендеринга или материальной системы, но вместо этого вы можете использовать float[2]
.
С++ 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);
}