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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сигнал в не-QObject базовом абстрактном классе  (Прочитано 8177 раз)
Pretorean
Гость
« : Август 12, 2011, 16:54 »

базовый абстракный класс должен гарантировать что все наследники смогут испустить сигнал определнного типа.
Код:
class A: {
 signals:
  virtual void a() = 0;
}

class B: public QObject, public A{
Q_OBJECT
signals:
  void a();
}

работа с экземляром класса ведется через указатель на базовый класс
Код:
A *instA = static_cast<A *>(new B())
...
connect(instA,SIGNAL(a()),this,SLOT(slot_a())

Это жизнеспособно ?
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #1 : Август 12, 2011, 17:00 »

class A : public QObject
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #2 : Август 12, 2011, 18:29 »

>>Это жизнеспособно ?
нет.
Либо делать как Пантер сказал, либо прикручивать чужую систему сигналов (например, boost), но тогда тот ещё зоопарк получится.
Записан

Юра.
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #3 : Август 12, 2011, 18:34 »

Тут в готовых решениях была реализация сигналов/слотов - можно тоже использовать. (я не пробовал)
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Pretorean
Гость
« Ответ #4 : Август 12, 2011, 20:41 »

class A : public QObject
так нельзя, потому что QObject не поддерживает множественное наследование
Записан
Пантер
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 5876


Жаждущий знаний


Просмотр профиля WWW
« Ответ #5 : Август 12, 2011, 20:46 »

А может множественное наследование не нужно?
Записан

1. Qt - Qt Development Frameworks; QT - QuickTime
2. Не используйте в исходниках символы кириллицы!!!
3. Пользуйтесь тегом code при оформлении сообщений.
Disaron
Гость
« Ответ #6 : Август 12, 2011, 20:47 »

Кхм... простите мое невежество, но разве можно экземпляр абстрактного класса создавать?
А сигналы виртуальными делать?
« Последнее редактирование: Август 12, 2011, 21:01 от Disaron » Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #7 : Август 13, 2011, 08:19 »

>>но разве можно экземпляр абстрактного класса создавать?
а где тут экземпляр абстрактного класса?
Записан

Юра.
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #8 : Август 13, 2011, 13:36 »

Цитировать
Тут в готовых решениях была реализация сигналов/слотов - можно тоже использовать. (я не пробовал)
А я пробывал)
У меня была похожая ситуация, когда базовый класс имел сигналы (правда он был не чисто виртуальным, но это не важно). Решил я её использованием libssc.
Код
C++ (Qt)
class A
{
public:
   ssc::signal<void> a;
   ...
};
 
class B : public A
{
...
};
 
A *instA = new B;
instA->a.connect(this, &SomeClass::someMethod);
 
 
Единственное что, SomeClass должен быть отнаследован от trackable
Код
C++ (Qt)
class SomeClass : public ssc::trackable
{};
 


Можно пойти и другим путём:
Код
C++ (Qt)
class A: {
 virtual void a() = 0;
}
 
class B: public QObject, public A{
Q_OBJECT
signals:
  void signal_a();
 
  void a() { emit signal_a(); }
}
 
Записан

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

Arch Linux Plasma 5
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #9 : Август 13, 2011, 14:21 »

Можно пойти и другим путём:
Тогда уж проще:
Код
C++ (Qt)
class A
{
 virtual void a() = 0;
}
 
class B: public QObject, public A
{
Q_OBJECT
...
signals:
  void a();
}
 
Правда это гарантирует нам, что у B будет функция a(), но не гарантирует, что она обязательно будет сигналом.

Коннект при этом будет выглядеть так:
Код
C++ (Qt)
A *instA = static_cast< A* >( new B() );
...
connect(dynamic_cast< QObject* >( instA ), SIGNAL( a() ), this , SLOT(slot_a() );
Записан
Fregloin
Супер
******
Offline Offline

Сообщений: 1025


Просмотр профиля
« Ответ #10 : Август 16, 2011, 08:58 »

я не понимаю, а зачем делать сигнал виртуальным? это ведь по сути сигнатура функции, тело все равно не определяется, а вызывается уже подключенный слот.
все сигналы являются protected.
я тоже в базовом классе объявлял сигнал, а потом в наследниках его эмитил и конектил без virtual.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #11 : Август 16, 2011, 09:04 »

Pure virtual функция в данном случае - это такой узелок на память «не забудь переопределить в потомках».
Записан
Pretorean
Гость
« Ответ #12 : Август 16, 2011, 09:29 »

всем спасибо.
пересмотрел подход, вопрос можно закрывать
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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