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

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

Страниц: 1 2 3 [4] 5 6   Вниз
  Печать  
Автор Тема: Protected вызов сигналов в Boost.Signals2  (Прочитано 35175 раз)
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #45 : Октябрь 17, 2015, 20:21 »

Код
C++ (Qt)
class BaseQtShape : public QObject
{
...
private:
   Q_INVOKABLE void test(bool value)
   { std::cout << "Test: " << value << std::endl; }
};
 
int main()
{
   QMetaObject::invokeMethod(&shape, "test", Q_ARG(bool, true));
}
 

Таким макаром можно официально и приватные методы вызывать Улыбающийся. И да, я в ужасе от таких возможностей. О чём это говорит? О том, что они специально так сделали, чтобы защищённые методы вызывать, или просто не стали в мета-информацию закладывать уровни доступа?

Почему тогда они стесняются пойти дальше и в той же версии Qt 4.x пишут:
Код:
Only the class that defines a signal and its subclasses can emit the signal.
Записан

Пока сам не сделаешь...
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #46 : Октябрь 17, 2015, 20:37 »

О том, что они специально так сделали, чтобы защищённые методы вызывать, или просто не стали в мета-информацию закладывать уровни доступа?
Если закладывать уровни доступа, то их нужно проверять в runtime. Каждый вызов слота должен проверяться. А чего добиваемся? Пытаемся дублировать уровни доступа языка, которые проверяются в compiletime?
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #47 : Октябрь 17, 2015, 20:52 »

Если закладывать уровни доступа, то их нужно проверять в runtime. Каждый вызов слота должен проверяться. А чего добиваемся? Пытаемся дублировать уровни доступа языка, которые проверяются в compiletime?

Так я о том и спрашиваю Улыбающийся. Я не знаю, чем руководствовались разработчики, позволяя через invokeMethod вызывать защищённые методы.

Стоит к invokeMethod относиться как к "официальной возможности", или всё же эта штука больше нужна для внутренних потребностей Qt? И раз она такая полезная оказалась, то дали возможность её всем пользоваться, взамен ожидая осторожности, поскольку она нарушает инкапсуляцию.
Записан

Пока сам не сделаешь...
Bepec
Гость
« Ответ #48 : Октябрь 17, 2015, 21:22 »

Qt развивается в сторону удобства разработчиков. Да, попираются стандарты, да, возможны отходы в сторону неоптимальных и "неправильных" в ООП вещах.
Но это удобно Улыбающийся

to m_ax: пролетел темку, не нашёл места где идёт переход с "хочу сделать так", на "должно соответствовать ООП" Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #49 : Октябрь 18, 2015, 02:20 »

Цитировать
to m_ax: пролетел темку, не нашёл места где идёт переход с "хочу сделать так", на "должно соответствовать ООП"
Ну как же, первый пост:
Цитировать
Т.е. тот же самый набор сигналов и слотов в полном объеме и с наследованием. Сами сигналы публичные, подключиться и отключиться от них может кто угодно. Только чтобы вызов сигнала (emit) был protected и "снаружи" никто не мог вызвать сигнал.
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #50 : Октябрь 18, 2015, 04:43 »

Допустим есть пара методов:
Код
C++ (Qt)
public:
   void move(int x, int y);
signals:
   void moved(int x, int y);
 
Велика ли вероятность ошибочного вызова shape.moved(x, y)? Со всеми этими "code completion" в редакторе, можно же просто промазать. Когда в запарке что-то быстро пишется, текст программы уже сливается, глаз замылился. Или все разработчики всегда собраны, всегда всё за собой проверяют, читают документацию? Улыбающийся
К сожалению да, такая вероятность велика. Я часто влетаю на аналогичном normalize/normalized. Но это никак не связано с слот/сигнал.

Так что там с бустом, разобрались? Да, я видел пример m_ax, но как-то.. сходу непонятно, а вникать нет необходимости. Почти наверняка бустовская реализация "профессиональнее", но в Qt на нем навешаны вкуснейшие плюшки. Напр легким движением руки (QueuedConnection) сигнал превращается в элегантное событие. Хотя бы ради этого можно и потерпеть гнусное "мокирование", а о такой мелочи как public неудобно и говорить
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #51 : Октябрь 18, 2015, 13:00 »

Так что там с бустом, разобрались? Да, я видел пример m_ax, но как-то.. сходу непонятно, а вникать нет необходимости. Почти наверняка бустовская реализация "профессиональнее", но в Qt на нем навешаны вкуснейшие плюшки. Напр легким движением руки (QueuedConnection) сигнал превращается в элегантное событие. Хотя бы ради этого можно и потерпеть гнусное "мокирование", а о такой мелочи как public неудобно и говорить

Конечно, большие минусы сигнал-слотов Qt явно не в том, что в 5-ой версии emit вдруг стал публичным Улыбающийся. Всё слишком завязано на инфраструктуру Qt в общем (что не удивительно), и на QObject в частности. Не всем и не всегда охота наследоваться от QObject или таскать его с собой, чтобы рассылать сигналы. Поэтому стало интересно, как обстоят дела в других системах сигнал-слот.

Ради одного сигнала из буста я бы не стал такой огород городить. Всё тривиально и в документации расписано. А вот как это использовать в более-менее большом проекте, который ещё хочет следовать "канонам ООП" Улыбающийся. Поэтому и говорил о "полном наборе сигналов и наследовании".

Вариант Old работает "здесь и сейчас", но в длительной перспективе использования мне он не очень нравится, и я писал почему. Вариант m_ax мне нравится больше, но дружба дружбой, а сигналы врозь Улыбающийся. Требование по наследованию не выполняется. Потомки Demo не смогут вызвать родительский my_signal.

В конечном итоге хотелось бы такой же лёгкости и краткости в описании сигналов, как в Qt Улыбающийся. Вот и стало интересно, насколько это реально с использованием сигналов буста. Пусть даже и с шаблонизацией 80-го уровня.
Записан

Пока сам не сделаешь...
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


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

Как по мне,

Цитировать
А вот как это использовать в более-менее большом проекте, который ещё хочет следовать "канонам ООП"

и

Цитировать
Пусть даже и с шаблонизацией 80-го уровня.

это вещи взаимоисключающие.

Да, и каким образом модель сигналов-слотов Qt противоречит "канонам ООП"? Это всего лишь способ обмена сообщениями между объектами в системе.

Цитировать
В конечном итоге хотелось бы такой же лёгкости и краткости в описании сигналов, как в Qt

Так ответ в этой вашей фразе Улыбающийся Просто Используйте Сигналы Qt Улыбающийся
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #53 : Октябрь 18, 2015, 15:40 »

Не всем и не всегда охота наследоваться от QObject или таскать его с собой, чтобы рассылать сигналы.
Да, это аргумент. Как говорил Штирлиц
Цитировать
Вот с этого и надо было начинать
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #54 : Октябрь 18, 2015, 17:04 »

А, так речь о том, чтобы симулировать кутишные сигналы не-кутишными средствами? Улыбающийся
Я-то был уверен, что автор хочет зарубить вызовы кутишных сигналов, если они не public...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Bepec
Гость
« Ответ #55 : Октябрь 18, 2015, 17:07 »

Он хочет сигналы с функциональностью Qt, но имеющие защиту от вызова из "посторонних" классов и поддерживающие наследование. Т.е. с защитой доступа.

Пока решения ему не предложили, которое бы удовлетворяло Улыбающийся
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #56 : Октябрь 18, 2015, 17:32 »

Ещё немного, и мне припишут, что я хочу на Марс на боинге долететь Улыбающийся.

А, так речь о том, чтобы симулировать кутишные сигналы не-кутишными средствами? Улыбающийся
Я-то был уверен, что автор хочет зарубить вызовы кутишных сигналов, если они не public...

Автор хочет лишь того, что обозначено в первом сообщении. Или хотя бы название темы внимательно прочитайте.
Записан

Пока сам не сделаешь...
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #57 : Октябрь 18, 2015, 18:22 »

Он хочет сигналы с функциональностью Qt, но имеющие защиту от вызова из "посторонних" классов и поддерживающие наследование. Т.е. с защитой доступа.

Пока решения ему не предложили, которое бы удовлетворяло Улыбающийся

Написать кутишникам и попросить сделать спецверсию сигналслотов, как вариант Подмигивающий

Хотя это желание из серии "хочу мерседес с двигателем от Т90"...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #58 : Октябрь 18, 2015, 18:24 »

Автор хочет лишь того, что обозначено в первом сообщении.

Просто от вас народ так и не добился, какая ПРАКТИЧЕСКАЯ НЕОБХОДИМОСТЬ такой штуки...
Если просто эксперимента, ну так вариантов немного, и все кривые.
Для реальных проектов это не нужно...
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



Просмотр профиля
« Ответ #59 : Октябрь 18, 2015, 19:24 »

Просто от вас народ так и не добился, какая ПРАКТИЧЕСКАЯ НЕОБХОДИМОСТЬ такой штуки...
Если просто эксперимента, ну так вариантов немного, и все кривые.

Почему-то Old и m_ax не понадобилось ничего добиваться, чтобы предложить конкретный вариант Улыбающийся. Вы хотя бы какой-нибудь вариант можете предложить, хоть кривой? Может там совсем немного надо подправить, чтобы выпрямить.

Для реальных проектов это не нужно...

То, что вам в реальных проектах не нужно, другим может понадобиться.
Записан

Пока сам не сделаешь...
Страниц: 1 2 3 [4] 5 6   Вверх
  Печать  
 
Перейти в:  


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