Копирование контейнера указателей
От: Аноним  
Дата: 26.06.08 14:39
Оценка:
Доброго времени суток. Подскажите пожалуйста, как мне создать копию stl контейнера, в котором находятся указатели на базовый класс

class Base
{
};

class Derived1 : public Base
{
};

class Derived2 : public Base
{
};
....................

std::vector<Base*> arr1;

arr1.push_back(new Derived1);
arr1.push_back(new Derived2);

std::vector<Base*> arr2; // Как в arr2 занести копию arr1 ???
Re: Копирование контейнера указателей
От: Were  
Дата: 26.06.08 14:47
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Доброго времени суток. Подскажите пожалуйста, как мне создать копию stl контейнера, в котором находятся указатели на базовый класс


А>
А>std::vector<Base*> arr1;

А>arr1.push_back(new Derived1);
А>arr1.push_back(new Derived2);

А>std::vector<Base*> arr2; // Как в arr2 занести копию arr1 ???
А>


В чем собственно проблема?

std::vector<Base*> arr2( arr1 );
Re: Копирование контейнера указателей
От: Vamp Россия  
Дата: 26.06.08 14:54
Оценка:
А>Доброго времени суток. Подскажите пожалуйста, как мне создать копию stl контейнера, в котором находятся указатели на базовый класс
Непонятно. Требуется глубокое копирование или обычное?
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Копирование контейнера указателей
От: Аноним  
Дата: 26.06.08 14:57
Оценка:
Здравствуйте, Were, Вы писали:

W>В чем собственно проблема?


W>
W>std::vector<Base*> arr2( arr1 );
W>


В этом случае, если я не ошибаюсь, в обоих контейнерах будут указатели на одни и те же объекты в куче, а мне надо чтоб на разные
Re[3]: Копирование контейнера указателей
От: Were  
Дата: 26.06.08 15:03
Оценка:
Здравствуйте, Аноним, Вы писали:

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


W>>В чем собственно проблема?


W>>
W>>std::vector<Base*> arr2( arr1 );
W>>


А>В этом случае, если я не ошибаюсь, в обоих контейнерах будут указатели на одни и те же объекты в куче, а мне надо чтоб на разные


Паттерн прототип тогда в помощь )

class Base
{
public:
    virtual Base* Clone() const
    {
        return new Base( *this );
    }
};

class Derived1 : public Base
{
public
    virtual Base* Clone() const
    {
        return new Derived1( *this );
    }
};

class Derived2 : public Base
{
    virtual Base* Clone() const
    {
        return new Derived2( *this );
    }
};

for( std::vector<Base*>::iterator I = arr1.begin(); I != arr1.end(); I++ )
    arr2.push_back( I->clone());
Re[3]: Копирование контейнера указателей
От: Centaur Россия  
Дата: 26.06.08 15:09
Оценка:
Здравствуйте, Аноним, Вы писали:

W>>В чем собственно проблема?


W>>
W>>std::vector<Base*> arr2( arr1 );
W>>


А>В этом случае, если я не ошибаюсь, в обоих контейнерах будут указатели на одни и те же объекты в куче, а мне надо чтоб на разные


Тогда нужно реализовать клонирование.

class Base
{
public:
  virtual Base* clone() const = 0;
};

class Derived1 : public Base
{
public:
  Derived1* clone() const { return new Derived1(*this); }
};

class Derived2 : public Base
{
public:
  Derived2* clone() const { return new Derived2(*this); }
};

[…]

std::vector<Base*> source;
std::vector<Base*> dest;
std::transform(source.begin(), source.end(), 
  std::back_inserter(dest),
  std::mem_fun(&Base::clone));
Re[4]: Копирование контейнера указателей
От: Аноним  
Дата: 26.06.08 15:12
Оценка:
Всем спасибо за оперативные ответы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.