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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: как запретить наследование сигналов в классах  (Прочитано 6917 раз)
shender
Гость
« : Март 22, 2010, 13:25 »

Собственно вопрос такой есть класс "А" с сигналом "а", его наследует некий класс "В", как в нем скрыть присутствие сигнала из класс "А"
Записан
Rcus
Гость
« Ответ #1 : Март 22, 2010, 13:39 »

Собственно языковыми средствами никак поскольку сигналы с точки зрения компилятора являются защищенными методами.
В Qt подобная проблема решена при помощи
Цитировать
Note: Components connected to this signal use it to adapt to changes in the model's dimensions. It can only be emitted by the QAbstractItemModel implementation, and cannot be explicitly emitted in subclass code.
И кто нарушит запрет тот ссзб.
Записан
niXman
Гость
« Ответ #2 : Март 22, 2010, 15:28 »

Цитировать
Собственно языковыми средствами никак
ошибка. языковые средства тут не при чем. ибо в с++ сигналов не существует.

Цитировать
сигналы с точки зрения компилятора
снова ошибка. у компилятора нет точки зрения по этому поводу. ибо в с++ сигналов не существует  Подмигивающий
Записан
Rcus
Гость
« Ответ #3 : Март 22, 2010, 18:28 »

Ох, целых две ошибки в одном предложении.
Пойду убью себя ©
Записан
SASA
Гость
« Ответ #4 : Март 22, 2010, 19:22 »

Собственно вопрос такой есть класс "А" с сигналом "а", его наследует некий класс "В", как в нем скрыть присутствие сигнала из класс "А"
а зачем?
Записан
niXman
Гость
« Ответ #5 : Март 22, 2010, 19:47 »

Цитировать
Пойду убью себя ©
вариант.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #6 : Март 22, 2010, 22:40 »

Мне все эти все слоты/сигналы никогда не нравились (возможно предубеждение). Но объясните, где проблема? Ведь сигнал/слот требует connect. Хочешь - связывай, не хочешь - нет. Все равно все в руках связывающего. Зачем тогда искать ограничения (на непонятно что)?
Записан
Zmeishe
Гость
« Ответ #7 : Март 23, 2010, 10:09 »

Мне все эти все слоты/сигналы никогда не нравились (возможно предубеждение).
Вполне возможно. Но мне очень понравились.

Но объясните, где проблема? Ведь сигнал/слот требует connect. Хочешь - связывай, не хочешь - нет. Все равно все в руках связывающего. Зачем тогда искать ограничения (на непонятно что)?
По моему автор темы хотел запретить в классе наследнике emit делать, а не связывание/развязывание.
Обратимся к Шлее:
Сигналы определяются в классе, как и обычные методы, только без реализации. С точки зрения программиста они являются только прототипами методов, содержащихся в заголовочном файле определения класса. Всю дальнейшую заботу о реализации кода для этих методов берёт на себя MOC.
Не имеет смысла определять сигналы как private, protected или public, так как они играют роль вызывающих методов.
Вывод:
В классе наследнике никак не скрыть присутствие сигнала из базового класса.


Записан
SASA
Гость
« Ответ #8 : Март 23, 2010, 10:39 »

В классе наследнике никак не скрыть присутствие сигнала из базового класса.
Если речь идёт о запрещении эмита, то в классе наследнике надо переопредлить сигнал, сделав его обычным методом (возможно пустым). Тогда при вызове емитом не чего не произойдёт.
Знаю из горького опыта  Смеющийся
Записан
Zmeishe
Гость
« Ответ #9 : Март 23, 2010, 10:55 »

А если так
Код:
class A: public QObject{
Q_OBJECT
 signals:
  void a();
}

class B: public A{
Q_OBJECT
  void a();
  void sendA()
  {
    emit A::a();
  }
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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