Russian Qt Forum
Июня 15, 2025, 20:12 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: c++ 11/14 vs "старый c++"  (Прочитано 15813 раз)
8: Undefined index: LANG_NAME
Файл: /var/www/html/Sources/geshi/geshi.php
Строка: 4032
AzazelloAV
Гость
« : Июня 21, 2017, 19:25 »

Данный пост не спрашивает никаких решений. Считайте это рассуждения вслух - кто как.

Классика RAII:
Код:
class Test
{
public:
    Test() { m_data = new Data; }
   ~Test() { delete mData; }
private:
    Data* m_data = 0;
}

По новому RAII:
Код:
class Test
{
public:
    Test();
   ~Test() = default
private:
    std::unique_ptr<Data> m_data;
    or
    QScopedPointer<Data> m_data;
}

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

Отказался от использования unique_ptr для таких (именно таких случаях, пусть это будет PImpl)
1.  Отсутсвует подсветка синтаксиса для m_data
2. Дебаг по коду позволяет ознакомиться с вырвиглазным кодом stl

Сразу отвечу противникам - даже если вы пропустили ваш делете, никто сейчас не программирует без профилировщика и не заметить пропуск такого явного удаления просто невозможно, причем в самом начале.

P.S. Пользуюсь ништяками c++11 давно.
« Последнее редактирование: Июня 21, 2017, 19:47 от AzazelloAV » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #1 : Июня 21, 2017, 20:18 »

1. Лечится включением шланг модели кода
2. Должно лечиться gdb pretty printers, нет?

Ну а так, unique_ptr exception-safe, а ручной Pimpl нет (например, тров в конструкторе после new)
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #2 : Июня 22, 2017, 08:27 »

Причем тут подсветка если ф-ционал разный.
Код:
    std::unique_ptr<Data> m_data;
    or
    QScopedPointer<Data> m_data;
Эти варианты неравноценны. QScopedPointer можно свободно копировать и отдавать по значению, а unique_ptr нет.

Вообще иметь unique_ptr членом как-то не очень, есть довольно стойкий рефлекс что оператор = и конструктор копирования принимают константные аргументы, а здесь это не так. Выносить моск ради жалкого delete - не вижу смысла
Записан
AzazelloAV
Гость
« Ответ #3 : Июня 22, 2017, 10:33 »

1. Лечится включением шланг модели кода
2. Должно лечиться gdb pretty printers, нет?

Поясните подробней.
И, кстати, не всегда же мы в одной среде сидим, в т.ч. в  разных ОС.

Ну а так, unique_ptr exception-safe, а ручной Pimpl нет (например, тров в конструкторе после new)

Согласен с вашим примером. НО, это только единственный пример, который можно привести.

Ну и конечно же, я точно уверен, что у вас стиль программирования таков, что никаких исключений в конструкторе Вы себе не позволяете.
Записан
AzazelloAV
Гость
« Ответ #4 : Июня 22, 2017, 10:35 »

Цитировать
Эти варианты неравноценны. QScopedPointer можно свободно копировать и отдавать по значению, а unique_ptr нет.

Вообще иметь unique_ptr членом как-то не очень, есть довольно стойкий рефлекс что оператор = и конструктор копирования принимают константные аргументы, а здесь это не так. Выносить моск ради жалкого delete - не вижу смысла

Простите, но вообще ничего не понял.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #5 : Июня 22, 2017, 12:02 »


Поясните подробней.
И, кстати, не всегда же мы в одной среде сидим, в т.ч. в  разных ОС.
Не, ну если у вас не креатор, то могу советовать погуглить как починить вашу иде:) А так, иде, не умеющая в вумные указатели - не нужна:)
А так, есть питоновские скрипты для gdb, которые "учат" его разворачивать умные указатели как обычные (без кишков). Как их подключить к иде я сходу не скажу (даже для креатора, давно это было). Вроде бы, под линухом достаточно поставить пакет. Под вин/мак вообще хз.

Согласен с вашим примером. НО, это только единственный пример, который можно привести.
Ну, мой пример выстрадан болью, а ваши надуманы:)

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

Почему нет? (Абстрагируемся о том, что исключения вообще с Qt кодом не дружат (я уже давно не пишу на Qt, к сожалению)). Это единственный способ сообщить об ошибке в конструкторе. Альтернативой будет только богомерзкий метод bool init(); который можно внезапно забыть вызвать. Или вызвать дважды. В общем, вы поняли, придётся писать много документации о том, как использовать ваш класс. Вместо банального инстанцирования.
« Последнее редактирование: Июня 22, 2017, 12:03 от Авварон » Записан