1

Тема: wxWidgets та розумні вказівники

Хотів замінити ось це:

wxSampleFrame* frame = new wxSampleFrame(0L, _("wxWidgets Application Template"));

на ось це:

std::unique_ptr<wxSampleFrame> frame { std::make_unique<wxSampleFrame>(0L, _("wxWidgets Application Template"))};

Видало таку помилку:
error: no matching constructor for initialization of 'wxSampleFrame'.

Якщо лишити звичайний вказівник, усе працює добре.
Як я розумію, wxWidgets сам закриває вказівники, коли закриваються відповідні вікна.
Я зробив десь помилку при створенні розумного вказівника
чи це просто конфлікт між розумним вказівником і конструктором wxWidgets?
Чи варто використовувати розумні вказівники разом із wxWidgets?

2

Re: wxWidgets та розумні вказівники

Vitaliy_Danmer написав:

чи це просто конфлікт між розумним вказівником і конструктором wxWidgets?

Можливо, проте важко сказати, ми ж не бачимо конструкторів wxSampleFrame.

Vitaliy_Danmer написав:

Чи варто використовувати розумні вказівники разом із wxWidgets?

Це в цілому холіварне питання, чи взагалі їх варто використовувати :)
unique_ptr - слідує RAII ідіомі, або як її ще називають Constructor Acquires, Destructor Releases. Якщо ваші класи (об'єкти) теж слідують цій ідіомі, то можна використати unique_ptr, інакше не варто.

Прихований текст
std::unique_ptr<FILE, /* custom deleter: */ std::function<decltype(fclose)>>

Ось так не треба писати. Це дуже погано.

Подякували: koala, Teg Miles, leofun01, mimik4

3

Re: wxWidgets та розумні вказівники

wxWidgets знищує об'єкти по Destroy, а не через стандартний delete, тому розумні вказівники можуть бути проблемою. Користуйтеся стандартними засобами wxWidgets.
А тут, як я розумію, проблема в тому, що _ - це макрос. Макрос як аргумент варіативного шаблона? Не знаю. Спробуйте зберегти значення у змінній, якщо вам дуже треба.

Подякували: Teg Miles, leofun01, ostap34PHP3