Мне сказали, что я должен использовать вектор указателей объектов, а не объектов. Зачем? Мое назначение требует специально, но мне также сказали, что иначе это не сработает.
Обычно следует избегать использования вектора объектов, чтобы избежать проблемы Срезы объектов . Чтобы заставить полиморфизм работать, вы должны использовать какие-то указатели. Я не уверен в том, как выровнены классы в вашем назначении, но, вероятно, у вас где-то там может быть Inheritance, и, следовательно, если vector хранит объекты базового класса и вы вставляете в него объекты класса Derived, то это приведет к срезанию членов производного класса выкл.
Лучшим решением будет использование интеллектуального указателя вместо необработанного указателя. STL имеет auto_ptr
, но его нельзя использовать в стандартном контейнере. Умные указатели будут лучшим решением, но, как вы уже сказали, вы не можете использовать Boost. Так что в вашем случае вы можете использовать реализацию интеллектуальных указателей вашего компилятора. , который входит в TR1
пространство имен, помните, однако, что есть некоторые разногласия в пространстве имен для функций TR1 (Visual C ++ помещает их в std::
, в то время как GCC помещает их в std::tr1::
).
Где мне создавать этот вектор? Должен ли он быть частью моего пакета класса? Как мне тогда добавить в него объекты?
В вашем примере кода уже есть пример добавления указателя на класс Package
в векторе. В двух словах, вы будете динамически размещать указатели на Package
и затем добавлять их к вектору.
Нужен ли мне конструктор копирования? Почему?
Конструктор копирования, сгенерированный компилятором, выполняет копирование по элементам. Иногда этого недостаточно. Например:
class MyClass {
public:
MyClass( const char* str );
~MyClass();
private:
char* str;
};
MyClass::MyClass( const char* str2 )
{
str = new char[srtlen( str2 ) + 1 ];
strcpy( str, str2 );
}
Class::~Class()
{
delete[] str;
}
В этом случае копирование элемента str
по элементам не будет дублировать буфер (будет скопирован только указатель (shallow copy
)), поэтому первая уничтоженная копия, разделяющая буфер, успешно вызовет delete[]
а второй столкнется с Undefined Behavior
. Вам нужно deep copying copy constructor
(и оператор присваивания также) в таком сценарии.
Когда лучше использовать пользовательский конструктор копирования, лучше всего определить Правило трех :
Whenever you are writing either one of Destructor, Copy Constructor or Copy Assignment Operator, you probably need to write the other two.
Как правильно деконструировать мой вектор указателей объектов?
Вам придется явно вызывать delete для каждого содержащегося в нем указателя, чтобы удалить содержимое, на которое он указывает.
vector::erase
Удаляет из векторного контейнера и вызывает его деструктор, но если содержащийся объект является указателем, он не берет на себя ответственность за его уничтожение.
Проверьте этот ответ здесь, чтобы узнать, как правильно удалить вектор указателя на объекты.