LINUX.ORG.RU

[C++]Продолжение темы по *_cast

 


0

1

Итак, уважаемые друзья, недавно мой друг dikar отпостил вопросы по поводу того зачем нужен *cast( тема Здесь). Так вот, пораскинув своими мозгами, мы поняли, что донесли до вас нашу спорную ситуацию не верно...И вот теперь исправляемся...

Значит дело было в следующем. На работе как и говорилось пишем визуальный интерфейс на Qt. Так как пишется он уже очень давно, то и коду выросло не мало. В один момент, по нажатию кнопки, у нас выскакивает наш написанный класс VIDACHA - потомок от QDialog. В этом классе живет другой наш класс. Это класс наследован от QWidget и называется Forms. Конструктор каждого из них принимает указатель на QWidget( прошу заметить, что сами классы между собой никак не связаны , но класс Forms при своем создании принимает указатель класса VIDACHA).Т.е:

class VIDACHA : public QDialog {
   VIDACHA( QWidget * = 0 );

   Forms *forms;
   //Другие виджеты
};

class Forms : public QWidget {
   Forms( QWidget * = 0 );

   public:
      void someFunction();
};

void Forms :: someFunction() {
   //Какие-то манипуляции после которого надо закрыть весь QDialog
   // Вот так мы закрыли QDialog
   VIDACHA *papa = dynamic_cast< VIDACHA* >( parent() );
   if( papa != NULL )
      papa -> close();
}

Это предложил я, вот тут у нас и возник спор. Мой друг и коллега dikar  это дело все удалил и сделал следующее:
void Forms :: someFunction() {
   //Какие-то манипуляции после которого надо закрыть весь QDialog
   // Вот так мы закрыли QDialog
   reinterpret_cast< VIDACHA* >( parent() ) -> close();
}

Вопрос, как правильно поступить в этой ситуации?


Последнее исправление: energyclab (всего исправлений: 1)

reinterpret_cast это интерпретация одного типа в другой. По сути это приведение с отключением безопасности типов, это один из самых худших кастов. Его нужно применять только там, где без него совсем не обойтись, но это бывает крайне редко.

Booster ★★
()
Ответ на: комментарий от Booster

По поводу reinterpret_cast. На сколько я понимаю эту операцию она должна быть использована только там, где необходима временная интерпретация целевого операнда. Например, если функция записи в файл принимает const char*, а я хочу передать структуру из различных полей, или класс, то эту совокупность байтов я могу попросить интерпретировать как const char*. вот здесь то как раз и нужен данный cast. Это своего рода замена приведению типов из С, когда надо было указать просто в скобках приводимый тип

energyclab
() автор топика
Ответ на: комментарий от energyclab

В общем да, reinterpret_cast это интерпретация куска памяти одного типа в другой тип. static_cast и dynamic_cast в обязательном порядке учитывают иерархию наследования и внутреннюю структуру типа, даже могут менять возвращаемые указатели(при множественном наследовании). reinterpret_cast можно использовать разве что для приведения структур данных и то только так называемых pod структур. Иначе там почти всегда будет UB, так как тупо интерпретировать кусок памяти одного типа в другой без учёта их внутреннего строения это ахтунг.

Booster ★★
()
Ответ на: комментарий от Booster

reinterpret_cast это интерпретация одного типа в другой. По сути это приведение с отключением безопасности типов, это один из самых худших кастов. Его нужно применять только там, где без него совсем не обойтись, но это бывает крайне редко.

так отвечать на вопрос можно только нубью одни сопли и никаких фактов что значит «худших» ? нужны технические подробности а такие советы только малыши хавают на веру

anonymous
()
Ответ на: комментарий от anonymous

Согласен. Но потом я написал что другие операторы делают дополнительную работу(операторы преобразования, учёт внутренней структуры, смотрят на гомоморфность(соответствие одной и тоже иерархии классов)), а reinterpret_cast просто интерпретирует кусок памяти одного типа, в другой. По-этому reinterpret_cast и есть самый небезопасный.

Booster ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.