2013-02-13 2 views
2

Я пытаюсь сделать глубокую копию для C++ boost :: shared_ptr.глубокая копия для C++ boost :: shared_ptr

struct A{ 
    boost::shared_ptr<const Data> dataPtr; 

    A(const A& aSource) { 
     dataPtr.reset(new const Data); 
     *dataPtr = *(aSource.dataPtr); 
}; 

Но, я получил сообщение об ошибке: ошибки: неинициализированный Const в «новый» из «сопзИте структуры А.

Если я не хочу бросить сопзЬ, как справиться с этим?

Любая помощь будет оценена по достоинству.

Спасибо!

+0

Таким образом, DataPtr будет указывать на неконстантные данные из-за const_cast? благодаря ! –

+2

Весь смысл 'shared_ptr' заключается в том, чтобы избежать глубокой копии. Если вам нужна глубокая копия, вам нужен другой тип указателя. (Вам также требуется соглашение о том, как делать глубокую копию. «Базовая *» может на самом деле указывать на «Derived», и это «Derived», которую нужно скопировать). –

ответ

5

Это потому, что вы пытаетесь изменить (в частности, присвоить) значения через const ссылку на него (потому что это то, что разыменования shared_ptr к const дает вам). Предположива Data имеет конструктор копирования, вы должны переписать вашу программу так:

struct A 
{ 
    boost::shared_ptr<const Data> dataPtr; 

    A(A const& aSource) 
    { 
     dataPtr.reset(new Data(*(aSource.dataPtr))); 
    } 
}; 
Смежные вопросы