2015-01-15 3 views
1

Работа на обучение, как использовать смарт-указатели и C++ в общем ... Предположим, что у меня есть следующий класс:Правильный способ инициализации unique_ptr

template<typename T> 
class MyClass { 
public: 
    MyClass(const T& def_val) 
private: 
    std::unique_ptr<T> default_val; 
}; 

Что идиоматических способ реализации конструктора, если I хотел бы только сохранить указатель на объект типа T со значением, заданным в члене класса default_val? Мое понимание также заключается в том, что мне вообще не нужно определять деструктор, так как unique_ptr автоматически позаботится о том, чтобы очистить себя?

+0

'unique_ptr 'владеет указателем на динамически распределяемый' T' ... поэтому вам нужно динамически распределить 'T' и сохранить его в' default_val' –

ответ

3

, как вы написали код, MyClass может хранить только уникальный указатель на копию параметра конструктора:

MyClass::MyClass(const T& def_val) 
: default_val(new T(def_val)) 
{ 
} 

Это означает, что T должна быть копия конструктивны.

Мое понимание также в том, что мне вообще не нужно определять деструктор, так как unique_ptr автоматически заботится о том, чтобы очистить себя?

Исправить. Это 1 из 2 основных целей для unique_ptr, второй - гарантия того, что у него есть только один владелец.

3

Если вы используете C++ 11 можно также добавить конструктор, который принимает RValue реф

template<typename T> 
class MyClass { 
public: 
    MyClass(T&& def_val) : default_val(new T(std::move(def_val))) {} 
    MyClass::MyClass(const T& def_val) : default_val(new T(def_val)) {} 
private: 
    std::unique_ptr<T> default_val; 
}; 

Теперь вы принимаете как константный реф, создавая копию, или временных

+2

Вы забыли выделить объект в конструкторе 'T &&'. –

+0

(Отредактировано для выделения объекта в конструкторе 'T &&'). Нотабене «Если вы используете C++ 11», это немного избыточно в вопросе о 'unique_ptr', который также помечен тегом [tag: C++ 11] –

Смежные вопросы