Russian Qt Forum

Qt => Общие вопросы => Тема начата: Pretorean от Август 12, 2011, 16:54



Название: Сигнал в не-QObject базовом абстрактном классе
Отправлено: 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())

Это жизнеспособно ?


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: Пантер от Август 12, 2011, 17:00
class A : public QObject


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: lit-uriy от Август 12, 2011, 18:29
>>Это жизнеспособно ?
нет.
Либо делать как Пантер сказал, либо прикручивать чужую систему сигналов (например, boost), но тогда тот ещё зоопарк получится.


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: Пантер от Август 12, 2011, 18:34
Тут в готовых решениях была реализация сигналов/слотов - можно тоже использовать. (я не пробовал)


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: Pretorean от Август 12, 2011, 20:41
class A : public QObject
так нельзя, потому что QObject не поддерживает множественное наследование


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: Пантер от Август 12, 2011, 20:46
А может множественное наследование не нужно?


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: Disaron от Август 12, 2011, 20:47
Кхм... простите мое невежество, но разве можно экземпляр абстрактного класса создавать?
А сигналы виртуальными делать?


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: lit-uriy от Август 13, 2011, 08:19
>>но разве можно экземпляр абстрактного класса создавать?
а где тут экземпляр абстрактного класса?


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: m_ax от Август 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(); }
}
 


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: LisandreL от Август 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() );


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: Fregloin от Август 16, 2011, 08:58
я не понимаю, а зачем делать сигнал виртуальным? это ведь по сути сигнатура функции, тело все равно не определяется, а вызывается уже подключенный слот.
все сигналы являются protected.
я тоже в базовом классе объявлял сигнал, а потом в наследниках его эмитил и конектил без virtual.


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: LisandreL от Август 16, 2011, 09:04
Pure virtual функция в данном случае - это такой узелок на память «не забудь переопределить в потомках».


Название: Re: Сигнал в не-QObject базовом абстрактном классе
Отправлено: Pretorean от Август 16, 2011, 09:29
всем спасибо.
пересмотрел подход, вопрос можно закрывать