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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Непонятки с QTcpSocket и наследованием  (Прочитано 3068 раз)
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'

Это баг или это какая-то специфика наследования, в чем разница чередования в списке наследования?
Записан
mutineer
Гость
« Ответ #1 : Апрель 08, 2011, 16:53 »

Это фича - в документации написано, что в списке наследования QObject или его наследник должен идти первым
Записан
blood_shadow
Гость
« Ответ #2 : Апрель 08, 2011, 16:57 »

Это фича - в документации написано, что в списке наследования QObject или его наследник должен идти первым
пробежал бегло только что описание QObject, но такого не увидел, а где это написано?
и просто интересно почему так?
Записан
mutineer
Гость
« Ответ #3 : Апрель 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
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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