Russian Qt Forum
Май 07, 2024, 13:05 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: 1 [2] 3 4   Вниз
  Печать  
Автор Тема: Прелестно  (Прочитано 21188 раз)
Bepec
Гость
« Ответ #15 : Сентябрь 30, 2014, 22:22 »

Мдамс. Берётся в уме класс с множеством сложных полей. С него лепим заглушку из методов, возвращающих одно и то же. И вуаля у нас N-ное количество классов, на которых можно испытывать что угодно.

А если делать стандартно, то нужно написать такой же класс заглушку, инициализировать все его поля и создавать с помощью new.
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #16 : Сентябрь 30, 2014, 22:57 »

Использовать сейчас можно, но никто не даёт гарантий.
Не представляю где это можно использовать. Улыбающийся

Код
C++ (Qt)
class MyClass
{
public:
   QString toString() const
   {
       if (this)
           return field_;
       else
           return QString();
   }
private:
   QString field_;
};
 

Ну вообще это боян. Ну да ладно...

1. проверка гарантированно сломается, если использовать множественное наследование.

2. this не может быть нулевым, иначе это - UB.
Компилятор закладывается на то, что программист не дибил, а значит он не сделает UB, а значит this никогда нулем не будет, а значит на нуль проверять не обязательно - и выпиливает эту проверку.

Поэтому, код сломается сразу же, как только вы попытаетесь собрать в режиме оптимизации.

3. А вообще данный код - это классика говнокода. И мусолил эту тему все, кому не лень.
Если кому нибудь захочется подробностей - загуглите статью на хабре.
Записан
_Bers
Бывалый
*****
Offline Offline

Сообщений: 486


Просмотр профиля
« Ответ #17 : Сентябрь 30, 2014, 23:05 »

Мдамс. Берётся в уме класс с множеством сложных полей. С него лепим заглушку из методов, возвращающих одно и то же. И вуаля у нас N-ное количество классов,

Которые не нужны. Сама по себе идея налепить множество классов сильно смахивает на "архитектуру ради архитектуры", ну или ооп головного мозга.

А если делать стандартно,

То пишется код, который иллюстрирует "как это должно работать".
Грубо говоря, примеры использования вашего механизма пишутся ещё до того,
как вы начнете создавать сам механизм.

И только после того, как был выработан дизайн, пишется реализация.

На этом кстати, базируется техника программирования TDD.

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

И тогда окажется, что 100500 непонятных классов, которые непонятно как использовать - не нужны.

Это конечно моё ИМХО.


Записан
Bepec
Гость
« Ответ #18 : Сентябрь 30, 2014, 23:12 »

Вот именно что имхо Улыбающийся

И немного лирики напоследок - в любых словах есть смысл. И если человек хочет - он его увидит Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #19 : Октябрь 01, 2014, 06:37 »

И немного лирики напоследок - в любых словах есть смысл. И если человек хочет - он его увидит Улыбающийся
Если бы он был, то вы уже давно набросали бы примерчик на c++ с демонстрацией того, как это удобно использовать, но пока только поток слов. Улыбающийся
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #20 : Октябрь 01, 2014, 07:12 »

Код
C++ (Qt)
class MyClass
{
public:
   QString toString() const
   {
       if (this)
           return field_;
       else
           return QString();
   }
private:
   QString field_;
};
 

И когда такой класс мне сможет пригодиться? Улыбающийся
Записан
Johnik
Крякер
****
Offline Offline

Сообщений: 339


Просмотр профиля
« Ответ #21 : Октябрь 01, 2014, 07:18 »

И как отработает этот класс в подобном случае:
Код
C++ (Qt)
   Foo *foo = (Foo*)28;
   foo->test();
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #22 : Октябрь 01, 2014, 07:45 »

И как отработает этот класс в подобном случае:
Код
C++ (Qt)
   Foo *foo = (Foo*)28;
   foo->test();

Падением программы? Улыбающийся если, вообще, такое скомпилируется Улыбающийся
« Последнее редактирование: Октябрь 01, 2014, 08:00 от gil9red » Записан

OKTA
Гость
« Ответ #23 : Октябрь 01, 2014, 09:16 »

Скомпилируется даже с нулевым указателем, но да, вылетит)
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #24 : Октябрь 01, 2014, 09:19 »

Скомпилируется даже с нулевым указателем, но да, вылетит)

Ну что ж поделать, компилятор, по умолчанию, уверен, что программист имеет прямые руки и они из правильного места она растут, поэтому и не ругается на такое приведение Улыбающийся
Записан

OKTA
Гость
« Ответ #25 : Октябрь 01, 2014, 09:19 »

И тихо смеется, видя, как программист отстреливает себе ногу  Смеющийся
Записан
GreatSnake
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2921



Просмотр профиля
« Ответ #26 : Октябрь 01, 2014, 10:18 »

В свете выше сказанного растолкуйте корявость сего хака
Код
C++ (Qt)
bool QUApplication::notify( QObject* o, QEvent* e )
{
...
case QEvent::KeyPress:
if( w->keyboardGrabber() == w )
{
class _QWidgetP_ : public QWidget
{
public:
_QWidgetP_( QWidget* p = 0, Qt::WindowFlags f = 0 ) : QWidget( p, f ) {}
bool event( QEvent* e )
{
return QWidget::event( e );
}
};
return ( (_QWidgetP_*) w )->event( e );
}
...
}
 

PS. Сей хак понадобился, чтобы обойти Qt-ишный баг, который позволяет отрабатывать QShortcut-ам при клавиатурном грабе.
PPS. QWidget::event() - protected.
« Последнее редактирование: Октябрь 02, 2014, 09:45 от GreatSnake » Записан

Qt 5.11/4.8.7 (X11/Win)
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #27 : Октябрь 01, 2014, 17:28 »

Так проще:

Код
C++ (Qt)
bool QUApplication::notify( QObject* o, QEvent* e )
{
...
case QEvent::KeyPress:
if( QWidget::keyboardGrabber() == w )   // keyboardGrabber статический же. :)
{
return w->QWidget::event( e );
}
...
}
 
Записан
Bepec
Гость
« Ответ #28 : Октябрь 01, 2014, 17:35 »

А пояснить зачем?
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #29 : Октябрь 01, 2014, 17:43 »

А пояснить зачем?
Архитектурку же проверить. Улыбающийся
Записан
Страниц: 1 [2] 3 4   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.26 секунд. Запросов: 23.