#c #c 14 #smart-pointers #unique-ptr #class-members
Вопрос:
Я не использовал std::make_unique
раньше, и проверка кода подтолкнула меня к этому.
Если я использую это, он не отображает ошибок:
auto x = make_unique<CChristianLifeMinistryHtmlView>();
Но когда я пытаюсь сделать это с помощью переменной-члена моего класса CChristianLifeMinistryHtmlView *m_pHtmlPreview
, ей это не нравится:
m_pHtmlPreview = std::make_unique<CChristianLifeMinistryHtmlView>();
Как я могу использовать std::make_unique
переменную-член класса?
Комментарии:
1. Это не имеет никакого отношения к участнику, если вы попробуете
CChristianLifeMinistryHtmlView *x = make_unique<CChristianLifeMinistryHtmlView>();
, у вас возникнет точно такая же проблема2. Вам нужно использовать
std::unique_ptr<CllassToBeUsed>
, но, похоже, вы изучаете его задним числом. Сначала вы должны понять, что такое интеллектуальные указатели.3.
std::shared_ptr
имеет счетчик,std::unique_ptr
обеспечивает уникальное владение, отсюда и его название. Я думаю, что вам сначала нужно понять их, а не слепо заменять необработанный указатель на умный. Они не настолько сложны, но нуждаются в понимании, чтобы правильно их использовать.
Ответ №1:
Ваша проблема не имеет ничего общего с членом класса, скорее с его типом!
std::make_unique()
возвращает std::unique_ptr
значение для типа шаблона T
(т. е. std::unique_ptr
экземпляра типа T
)
template< class T, class... Args >
unique_ptr<T> make_unique( Argsamp;amp;... args );
^^^^^^^^^^^^^^
Член
CChristianLifeMinistryHtmlView *m_pHtmlPreview;
является указателем на а CChristianLifeMinistryHtmlView
, а не на а std::unique_ptr
. Следовательно, несоответствие типов.
Как я могу использовать
make_unique
переменную-член класса?
Поэтому вам необходимо использовать std::unique_ptr<CChristianLifeMinistryHtmlView>
в качестве типа m_pHtmlPreview
элемента:
std::unique_ptr<CChristianLifeMinistryHtmlView> m_pHtmlPreview;
...
m_pHtmlPreview = std::make_unique<CChristianLifeMinistryHtmlView>();
Если это длительный ввод, псевдоним типа был бы неплохой идеей:
using UniqueCLMHView = std::unique_ptr<CChristianLifeMinistryHtmlView>;
UniqueCLMHView m_pHtmlPreview;
...
m_pHtmlPreview = std::make_unique<CChristianLifeMinistryHtmlView>();