Проблема с использованием std::make_unique с переменной-членом класса

#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>();