Russian Qt Forum

Qt => Работа с сетью => Тема начата: blood_shadow от Апрель 08, 2011, 16:42



Название: Непонятки с QTcpSocket и наследованием
Отправлено: blood_shadow от Апрель 08, 2011, 16:42
В общем даже незнаю это баг или я чего-то не понимаю,
пишу почтовый клиент:
есть класс

Код
C++ (Qt)
class SmtpAuthData
{
....
 
};
 

это класс обычных данных, которые нужны для авторизации,
сам класс который занимается приемом\передачей запросов серверу почты
наследуется от этого класса и QObject:

Код
C++ (Qt)
class Letter : public QObject, private SmtpAuthData
{
 
   SmtpAuthData smtpData;
   const QString helloSmtp;
 
   // internet connection
   QTcpSocket tcpSocket;
   quint16 blockSize;
 
   Q_OBJECT
 
...
 
private slots:
   void error_happens(QAbstractSocket::SocketError socketError);
   void stateBecomeChange(QAbstractSocket::SocketState state);
...
 
 

из-за того что есть слот
Код
C++ (Qt)
void stateBecomeChange(QAbstractSocket::SocketState state);
,
который реагирует на сигнал
Код
C++ (Qt)
stateChanged(QAbstractSocket::SocketState )

в конце хедера пришлось добавить Q_DECLARE_METATYPE(QAbstractSocket::SocketState);

Все хорошо, но если поменять местами классы в записи наследования, например
Код
C++ (Qt)
class Letter :  private SmtpAuthData, public QObject
то компоновщик начнет сыпать ошибками:
Код:
debug\moc_Letter.cpp:53:8: error: 'staticMetaObject' is not a member of 'SmtpAuthData' 
debug\moc_Letter.cpp: In member function 'virtual void* Letter::qt_metacast(const char*)':
debug\moc_Letter.cpp:73:12: error: 'qt_metacast' is not a member of 'SmtpAuthData'
debug\moc_Letter.cpp: In member function 'virtual int Letter::qt_metacall(QMetaObject::Call, int, void**)':
debug\moc_Letter.cpp:78:11: error: 'qt_metacall' is not a member of 'SmtpAuthData'

Это баг или это какая-то специфика наследования, в чем разница чередования в списке наследования?


Название: Re: Непонятки с QTcpSocket и наследованием
Отправлено: mutineer от Апрель 08, 2011, 16:53
Это фича - в документации написано, что в списке наследования QObject или его наследник должен идти первым


Название: Re: Непонятки с QTcpSocket и наследованием
Отправлено: blood_shadow от Апрель 08, 2011, 16:57
Это фича - в документации написано, что в списке наследования QObject или его наследник должен идти первым
пробежал бегло только что описание QObject, но такого не увидел, а где это написано?
и просто интересно почему так?


Название: Re: Непонятки с QTcpSocket и наследованием
Отправлено: mutineer от Апрель 08, 2011, 17:37
Цитировать
If you are using multiple inheritance, moc assumes that the first inherited class is a subclass of QObject. Also, be sure that only the first inherited class is a QObject.

http://doc.trolltech.com/4.7/moc.html#multiple-inheritance-requires-qobject-to-be-first (http://doc.trolltech.com/4.7/moc.html#multiple-inheritance-requires-qobject-to-be-first)