Использование Vector указателей на объекты, которые имеют указатели c ++

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, я вижу, что идентификаторы различны, но атмосфера и диффузия одинаковы для всех элементов. Возможно, потому, что он использует один и тот же указатель в цикле while, но я не мог найти альтернативу. Каким должен быть лучший подход здесь? благодаря

  • 5
    Ваши указатели указывают на переменные, которые являются локальными для цикла while. Это неопределенное поведение. Почему бы не хранить массивы или векторы вместо указателей?
  • 0
    Должен ли я использовать массивы вместо указателей в моем классе? вместо того, чтобы плавать * атмосфера; атмосфера плавания [3];
Показать ещё 2 комментария
Теги:
pointers

1 ответ

1
Лучший ответ

Я стараюсь избегать указателей, насколько смогу. Начните с вашего вектора. Почему он должен быть 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);
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню