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

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

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

Сообщений: 2679


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


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

Не отнимайте у юных и убогих возможность выстрелить себе в голову Веселый

Ладно бы себе, они ж и другим отстрелить головы могут  Веселый.

Ну а что, лучше городить кучу нечитаемого индокода в надежде на то, что он помешает кому-то вызвать какой-то там сигнал Непонимающий

Вам не кажется, что сама идея этого уже ненормальна и отдает каким-то... маразмом, что ли? Разрабы 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 не волк, в лес не уйдёт
Bepec
Гость
« Ответ #31 : Октябрь 17, 2015, 12:14 »

Разрабы как раз используют предложенный мной метод - внутри интерфейсного класса имеется приватный класс со своими сигналами и механикой, до которого хрен достучишься Улыбающийся
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



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

Ну а что, лучше городить кучу нечитаемого индокода в надежде на то, что он помешает кому-то вызвать какой-то там сигнал Непонимающий

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

Тему внимательно читали? И документацию Qt? См. ответ #7.

До сих пор в упор не понимаю, что вам мешает нужные вам сигналы вывести на интерфейсный класс, а свой спрятать внутри. И фиг кто подцепится.
Т.е. пробросить нужные сигналы через интерфейсный, а внутренние не проявлять. И получаем ваши хотелки - класс с сигналами внутри (которые никто не может вызвать, ибо нет доступа к указателю на класс) и с сигналами проброшенными через интерфейсный класс, которые только и сможет вызывать и цеплять программист.

PS это же простое использование инкапсуляции - не хошь чтобы рылись в нутрях - дай только интерфейсный класс Веселый

В моём первом сообщении задача вроде поставлена достаточно конкретно Улыбающийся. Для того примера можете написать "интерфейсный" класс и "свой"? Хоть на Qt, хоть на бусте хоть на чём Улыбающийся.
Записан

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

Сообщений: 11445


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

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

Ладно, на бусте так на бусте. Ну а почему бы не открыть доку буста, взять тамошний пример слот/сигнал и сделать по образцу. А примеры там есть (помню). В чем проблема и что собственно обсуждать?

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

Сообщений: 4350



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

это автоматычно означает что Вы не умеете поставить задачу Улыбающийся

и это говорит король постановки задач...  Смеющийся

P.S. Простите, не удержался. Улыбающийся
Записан
Bepec
Гость
« Ответ #35 : Октябрь 17, 2015, 17:01 »

Перечитал темку - вы требуете невозможного.
Сокрыть сигнал, который должен быть открытым для оповещения и подключения.
Да, вы хотите запретить вызов сторонним объектом, но сигнал НЕ ЯВЛЯЕТСЯ полем класса. Сигнал по сути это описание в менеджере сигнал слотовой системы.
Чтобы изменить работу сигнала, надо менять сигнал слотовую систему или написать свою.
 
Идея интересная, но бессмысленная.
Дурак никогда до такого не додумается. А умный и так знает, что если самому вызывать фиг пойми какие сигналы с произвольными аргументами, программа фиг знает что будет делать.
 
Я б посоветовал написать в комментариях "Произвольный вызов сигналов ведёт к непредсказуемому поведению класса" и потом дураков-умников, которые так сделают, тыкать туда носом Веселый

PS наглядный пример - сам Qt. Ещё никому не удавалось додуматься до вызова сигнала объекта с произвольными параметрами. Вы можно сказать первооткрыватель Веселый
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Цитировать
Перечитал темку - вы требуете невозможного.
Да ну ладно?)

Цитировать
Сокрыть сигнал, который должен быть открытым для оповещения и подключения.
Да, вы хотите запретить вызов сторонним объектом, но сигнал НЕ ЯВЛЯЕТСЯ полем класса. Сигнал по сути это описание в менеджере сигнал слотовой системы.
Не совсем так.. Вполне понятна и естественна ситуация, когда (внутренняя) логика класса знает в каких случаях эмитить сигнал, и не хочет чтобы на этот процесс влиял кто-либо извне, но, с друнгой стороны, предоставитиь возможность этой самой другой стороне подписываться на этот сигнал, то это нормальное законное желание. Не противоречащее канонам ООП и философии C++ в частности)

igors, проверьте, я там всё без ошибок (орфографических и пунктуационных) написал?  Улыбающийся

 
Цитировать
PS наглядный пример - сам Qt. Ещё никому не удавалось додуматься до вызова сигнала объекта с произвольными параметрами. Вы можно сказать первооткрыватель
А это здесь вообще причём?
« Последнее редактирование: Октябрь 17, 2015, 17:41 от m_ax » Записан

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

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

Сообщений: 11445


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

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

igors, проверьте, я там всё без ошибок (орфографических и пунктуационных) написал?  Улыбающийся
2 запятые не на месте. 2 раза описАлись. И мой ник пишется с большой буквы.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



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

А напр здесь - ну опять полная безграмотность  Улыбающийся
Даааа, не идет народ в ваши темы, не идет. Даже не смотря на то, что вопросы вы поднимаете простенькие и уверен многие бы с удовольствием поучаствовали в их обсуждении. Хамство в купе с высокомерием делают свое дело.
« Последнее редактирование: Октябрь 17, 2015, 18:15 от Old » Записан
Bepec
Гость
« Ответ #39 : Октябрь 17, 2015, 18:58 »

Наглядный пример Qt. Вы можете тем же способом что и привели в 1 сообщении данной темы испоганить ВСЁ, начиная от QObject и заканчивая QWebView.
Просто отсылая от имён стандартных виджетов сигналы. Но почему то ни 1 темы нет - это плохо работает, я посылаю сигнал destroyed от mainWindow и у меня падает программа.
Почему нет таких тем? Потому что никому такое не нужно и все понимают, что если засунуть в работающий движок машины руку, то либо рука нафиг, либо мотор. (хотя чаще рука Веселый)
Записан
ViTech
Гипер активный житель
*****
Offline Offline

Сообщений: 858



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

Сокрыть сигнал, который должен быть открытым для оповещения и подключения.
Да, вы хотите запретить вызов сторонним объектом, но сигнал НЕ ЯВЛЯЕТСЯ полем класса. Сигнал по сути это описание в менеджере сигнал слотовой системы.

Интересное мнение о системе сигнал-слот Улыбающийся. Но рациональное зерно есть.

С позволения m_ax, приведу кусок его кода:
Код
C++ (Qt)
template <class Friend, class R, class... Args>
class signal<Friend, R(Args...)>
{
public:
   template <class Slot>
   void connect(Slot slot) { m_sig.connect(slot); }
 
  template <class Slot>
   void disconnect(Slot slot) { m_sig.disconnect(slot); }
 
protected:
   friend Friend;
   boost::signal2::signal<R(Args...)> m_sig;
 
   void emit(Args... args) { m_sig.emit(args...); }
};
 
class Demo
{
public:
   signal<Demo, void( int )> my_signal;
 
   void emit(int val) { my_signal.emit(val); }
};
 

В этом примере signal<>::m_sig и Demo::my_signal чем являются для класса? Или это не сигналы?

Ещё раз процитирую документацию Qt:
Цитировать
Signals are public access functions and can be emitted from anywhere, but we recommend to only emit them from the class that defines the signal and its subclasses.

Собственно, в примере из первого сообщения можно было написать просто:
Код
C++ (Qt)
shape.visibleChanged(true);
Т.е. "сигнал" в Qt - это публичный метод. В обоих случаях термин "описание в менеджере сигнал слотовой системы" не раскрывается Улыбающийся. За магией трудно проследить реальное положение вещей.

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

Наглядный пример Qt. Вы можете тем же способом что и привели в 1 сообщении данной темы испоганить ВСЁ, начиная от QObject и заканчивая QWebView.
Просто отсылая от имён стандартных виджетов сигналы. Но почему то ни 1 темы нет - это плохо работает, я посылаю сигнал destroyed от mainWindow и у меня падает программа.
Почему нет таких тем? Потому что никому такое не нужно и все понимают, что если засунуть в работающий движок машины руку, то либо рука нафиг, либо мотор. (хотя чаще рука Веселый)

В Qt 4.x emit сигналов был protected. Потому таких тем и не было. Приучили к хорошему. А с Qt 5 не все знают, что теперь они публичные.
Записан

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

ViTech, invokeMethod позволяет с версии 4.7 ТОЧНО (а по логике и ранее) вызвать любой сигнал и/или слот объекта, имея на него указатель Веселый

То, что написал ТС просто недокументированная возможность, но вкупе с ней спокойно можно написать QMetaObject::invokeMethod(point, "slot/signal"). И это официальная и документированная возможность.

Могу и ошибаться, но и в версии Qt 5.5 она остаётся работоспособной, т.к. старые проекты работают и в ус не дуют Веселый
Работает в 4.7 и в 5.5

Система сигнал слот включается в себя и moc. Который просто пробегается по всем signals/emit и прочим и уже на основании этих описаний строит код Улыбающийся

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

PS сча проверю можно ли вызвать сигнал с параметрами Веселый

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

PPPS собственно этим и было вызвано моё удивление - сама система позволяет это сделать официально, а ТС в ужасе от таких возможностей Улыбающийся
« Последнее редактирование: Октябрь 17, 2015, 20:08 от Bepec » Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Цитировать
2 запятые не на месте. 2 раза описАлись. И мой ник пишется с большой буквы.
Прошу прощения за ошибки) Это всё виноват товарищ Racheengel .. Накаркал тогда про мою хрестоматийную минималистичную клавиатуру, и через пару дней на неё вылили бокал вина(( Вот теперь сижу с мультимедийной, такой непривычной.. По клавишам клянцаю с таким усилием..(

Цитировать
invokeMethod позволяет с версии 4.7 ТОЧНО (а по логике и ранее) вызвать любой сигнал и/или слот объекта, имея на него указатель
А invokeMethod, по вашему соответствует ли идеологии ООП в контексте сигнал/слотов?
Записан

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

Arch Linux Plasma 5
Bepec
Гость
« Ответ #43 : Октябрь 17, 2015, 20:17 »

Система сигнал слотов рвёт ООП в сторону удобства Веселый И это выгодный размен, как показало время Улыбающийся
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



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

Система сигнал слотов рвёт ООП в сторону удобства Веселый И это выгодный размен, как показало время Улыбающийся


Значит всё-таки не соответствует? А теперь ещё раз перечитайте тему)
Записан

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

Arch Linux Plasma 5
Страниц: 1 2 [3] 4 5 6   Вверх
  Печать  
 
Перейти в:  


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