Я хотел бы иметь возможность вызвать нетривиальный конструктор объекта, когда я использую метод push_back()
. Вместо этого все, что я мог сделать, это передать мелкую копию объекта в вектор. При использовании регулярных массивов c-style конструктор автоматически вызывается при создании массива, но поскольку векторы являются динамическими, объект еще не существует.Инициализировать объект с помощью указателей в векторе C++
Как я могу добавить новый пустой объект к вектору, не имея двух указателей на один и тот же адрес памяти? Нужен ли мне конструктор копирования или перегруженный оператор присваивания?
Вот пример кода, который демонстрирует мою проблему:
struct Object
{
int *Pointer;
Object()
{
Pointer = new int;
*Pointer = 42;
}
~Object()
{
delete Pointer;
}
};
int main()
{
std::vector <Object> *Array;
Array = new std::vector <Object>;
// Attempt 1
Array->push_back(Object());
// Attempt 2
{
Object LocalInstance;
Array->push_back(LocalInstance);
}
// Error here because the destructor has already been called for
// LocalInstance and for Object()
delete Array;
return 0;
}
Не использовать указатели здесь. Это необязательно и делает код менее эффективным и более сложным. –
Это упрощение фактического кода, чтобы облегчить задачу поиска/отладки. Фактический код должен иметь эти указатели. – JubileeTheBear
Даже если вам действительно нужен указатель, вы должны предпочесть интеллектуальные указатели в контейнерах STL, таких как [boost :: shared_ptr] (http://www.boost.org/doc/libs/1_57_0/libs/smart_ptr/shared_ptr.htm) или [std :: shared_ptr] (http://en.cppreference.com/w/cpp/memory/shared_ptr). – dbank