S>Вот смотрите, QT принимает указатель на QGraphicsEffect в метод setGraphicsEffect(*QGraphicsEffect) класса QWidget.
Это не про RAII. Про него написано тут https://en.cppreference.com/w/cpp/language/raii.
S>Однако же при удалении QWidget они удаляют и переданный QGraphicsEffect. Даже если он создавался в другом месте и был передан в конструктор виджета.
S>Правы ли они?
Да. Их право, как сделать. Они ж написали в доке:
Здравствуйте, DiPaolo, Вы писали:
S>>Вот смотрите, QT принимает указатель на QGraphicsEffect в метод setGraphicsEffect(*QGraphicsEffect) класса QWidget. DP>Это не про RAII. Про него написано тут https://en.cppreference.com/w/cpp/language/raii.
Но кто выделяет память в куче для объекта QGraphicsEffect?
Здравствуйте, Shmj, Вы писали:
S>Нарушение ли это принципа RAII?
Нарушить можно закон, клятву или обещание. А RAII — это просто техника, идома — ее можно использовать или не использовать. В этом случае RAII не используется. Ты бы и сам это легко понял, если бы открыл хотя бы википедию. С тем же успехом можно было бы спросить "нарушение ли это идиомы pImpl?". Нет, не нарушение — просто здесь это не используется.
S>Правы ли они?
С этим вопросом лучше к правоведам.
P.S. Мне интересно, ты, прежде чем что-то написать, делаешь какие-нибудь паузы, чтоб подумать, или тебе главное, чтоб побольше текста было?
Здравствуйте, Shmj, Вы писали:
S>Но кто выделяет память в куче для объекта QGraphicsEffect?
"Пользователь" этого класса
1. Создаешь
2. Настраиваешь свойства, подсоединяешь сигнала-слоты
3. Передаешь владельцу.
Если есть вероятность выброса исключений на шаге 2, то можно использовать умные указатели и RAII:
Пример:
auto data = std::unique_ptr<QSurfaceDataArray>(new QSurfaceDataArray);
// do something with data
...
// transfer ownership
m_powerSeries->dataProxy()->resetArray(data.release());