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);
Первый инициализирует переменную-член, которая означает, что она имеет запланированное значение на месте, готовое к работе, до начала предоставляемой пользователем функции построения. Я предпочитаю этот подход, потому что это означает отказ от целого класса дефектов, которые возникают с неинициализированными переменными. С другой стороны, 'std :: make_unique' имеет преимущества в макете памяти, которые также не следует отклонять: https://stackoverflow.com/questions/22571202/differences-between-stdmake-unique-and-stdunique-ptr – Ben
Игнорируйте вышеупомянутый комментарий о макете памяти, поскольку он применяется только к 'shared_ptr'. Sutter имеет хорошую публикацию GotW для общего использования общих и уникальных указателей: https://herbsutter.com/2013/05/29/gotw-89-solution-smart-pointers/ – Ben
Вы можете использовать 'std :: make_unique () 'в списке инициализации конструктора, например:' A :: A (int a): int_ptr_ (std :: make_unique (a)) {} ' –