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)

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

AutoConnection это дефолтный коннект, он сам выбирает использовать QueuedConnection или DirectConnection в зависимости от ситуации:
http://doc.qt.nokia.com/latest/qt.html#ConnectionType-enum

Вот для сравнения.
Вызов при DirectConnection:
https://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/kernel/qmetaobjec...
Если посмотреть какой-нибудь moc файл, то там можно найти функцию qt_metacall, в котором есть switch, через который похоже и находится нужный слот.
Я не очень понимаю магию с callFunction, но этого нет в 4.7, то есть видимо появится только в Qt 5 (для которого выделили отдельный репозиторий qtbase).

В QueuedConnection можно найти вызов postEvent:
https://qt.gitorious.org/qt/qtbase/blobs/master/src/corelib/kernel/qmetaobjec...

Вообще есть интересная статья по внутренностям Qt:
http://www.ntcore.com/files/qtrev.htm

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

это обычный макрос Qt

Именно, и он ничего не делает:

#ifndef QT_NO_EMIT
# define emit
#endif
Вообще, его мог бы moc использовать, но не похоже чтобы использовал.

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

Маугли в очередной раз пытается унизить человека не приводя аргументов? Это уже перестает быть интересным ;)

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

я специально написал n байт,так как для разных систем может быть по разному( например в иа64 указатель уже 8 байт).с void лучше вообще лишний раз не связываться,и если qobgect класс папа то именно его и надо возвращать,вспомни главу про наследование...по поводу 4 пункта,можно в нашем случае обойтись любым кастом и это точно будет работать....а reinterpret_cast никуда не ушел,его бы не упоминали бы тогда в стандартно...вещь нужная и даже очень....про маугли понравилось,смеялся я долго,и вообще,таким как этот дитя джунглей надо помалкивать,ибо не набрался сил лазить вглубь по джунглям с++ и говорить что все не правильно не приводя никаких аргументов...специально для него поясняю,что это был просто проффспор,а человек с ником dikar является моим очень хорошим другом так что спасибо ему так сказать за мотивацию к росту в освоении языка

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

static_cast выделяет память под целевой операнд с его типом данных,делает копию приводимого объекта и кладет значение в выделенную память....таким образов получается так,как будто бы мы объявили переменную с новым типом и инициализировали значением приводимого типа...а reinterpret_cast лишь говорит компилятору что при выполнении этой команды вот с этой областью памяти ты должен работать так же как с типом указанных в угловых скобках....и естественно там не будет никакой мантисы(точнее значения в ней,фактическиски то она будет,вопрос только в интерпретации полей битов компилятором),он просто посчитает из 4 байт 1 бит за знаковый,если не ошибаюсь 11 за мантису и 20 за дробную часть числа,в случае же со static_casting то будет выделено 4 байта,знаковый установиться в нужный,мантиса станет равной 1 а дробная часть будет 0(на сколько помню из курса информатики одно смещение уже заведомо всегда известно,и его нет смысла записывать в память(это я все для 0.1 говорю),хотя форм представления мантисы много)

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

ты свой пост сначала прочитало бы, а потом уже и пробЫвал что-то вякать

Ничего, скоро каникулы закончатся, учительница вас научит правильно писать слово проёбывал.

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