2017-01-10 7 views
2

Как создать новое и присвоить значение private unique_ptr в конструкторе класса? Tyvm: ^) КитКак создать новое значение и назначить private unique_ptr в конструкторе класса?

Мои лучшие усилия:

#include <iostream> 
#include <memory> 

class A { 
public: 
    A() {}; 
    A(int); 
    void print(); 
private: 
    std::unique_ptr<int> int_ptr_; 
}; 
A::A(int a) { 
    int_ptr_ = new int(a); 
} 
void A::print() { 
    std::cout << *int_ptr_ << std::endl; 
} 
int main() { 
    A a(10); 
    a.print(); 
    std::cout << std::endl; 
} 

Компилятор Результат:

smartPointer2.1.cpp:13:11: error: no match for ‘operator=’ (operand types are ‘std::unique_ptr<int>’ and ‘int*’) 
    int_ptr_ = new int(a); 

ответ

8

Написать

A::A(int a) : int_ptr_(new int(a)) 
{ 
} 

Или вы могли бы написать

A::A(int a) 
{ 
    int_ptr_.reset(new int(a)); 
} 

или

A::A(int a) 
{ 
    int_ptr_ = std::make_unique<int>(a);; 
} 

Первый подход лучше, потому что в двух других, кроме конструктора по умолчанию там называется также дополнительный метод или оператор присваивания ход.

+0

Первый инициализирует переменную-член, которая означает, что она имеет запланированное значение на месте, готовое к работе, до начала предоставляемой пользователем функции построения. Я предпочитаю этот подход, потому что это означает отказ от целого класса дефектов, которые возникают с неинициализированными переменными. С другой стороны, 'std :: make_unique' имеет преимущества в макете памяти, которые также не следует отклонять: https://stackoverflow.com/questions/22571202/differences-between-stdmake-unique-and-stdunique-ptr – Ben

+0

Игнорируйте вышеупомянутый комментарий о макете памяти, поскольку он применяется только к 'shared_ptr'. Sutter имеет хорошую публикацию GotW для общего использования общих и уникальных указателей: https://herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers/ – Ben

+0

Вы можете использовать 'std :: make_unique () 'в списке инициализации конструктора, например:' A :: A (int a): int_ptr_ (std :: make_unique (a)) {} ' –

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

  • Нет связанных вопросов^_^