Re[2]: std::vector. как правильно упаковать в вектор объект
От: __GnoM  
Дата: 04.09.06 21:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:



А>
А>>class A
А>>{
А>>   public:
А>>     A();
А>>     ~A();
А>>     BOOL Init();
А>>     BOOL Start();
А>>   .
А>>   .
А>>   .
А>>   private:
А>>     vector<B> vec;
А>>};

А>[ кусь ]

А>>A::~A()
А>>{
А>А>   vector<B>::iterator iter = vec.begin(); // Этот код не может не падать. ВЕКТОР УДАЛИТ ЭЛЕМЕНТЫ САМ.
А>>   while(iter != vec.end())
А>>   {
А>>      delete iter;
А>>      iter++;
А>>   } 
А>>}

Можно уточнить, вектор удалит элементы сам путём вызова деструктора ~B() или как???
Просто если в B имеет место динамическое выделение памяти, необходимо гарантировать её стопоцентное освобождение???

Да и вопрос остался. Падает только на втором элементе вектора, первый успешно удаляется!

А>>BOOL A::Init(параметры)
А>>{
А>>  B *pB;
А>>  pB = new B(параметры); // Зачем создавать по new? на стеке тоже пректасно можно создавать элементы.
А>>  vec.push_back(*pB);    // Я бы написал vec.push_back( B(параметры) );
А>>  delete pB;
А>>}

Данный метод - это просто пример для обсуждения, в реально используемом классе нужно было гарантировать правильное создание объекта и инициализацию его параметров, поэтому создаётся динамически. Неудобно, но другого варинта не нашлось, пока....

А>

А>[кусь]

А>>Операторы присваивания и конструкторы копирования класса B написаны и отлично работают.


А>Код

А>B( const B & )
А>const B operator = ( const B & )
А>~B();
А>В студию.

С удовольствием бы выкинул, но пример приводимый тут снят с разрабатываемой модели, а поэтому если выкидывать реализацию операторов, то придётся выкладывать и много сопутсвующего материала

да и ещё
А>const B operator = ( const B & )

не слишком рекомендуется, лучше

B& operator= (const B& rhs), причины хорошо описаны Скотом Мейерсом (см. правило 15).
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.