QObject множественное наследование и оператор new - PullRequest
1 голос
/ 10 марта 2012

Застрял в этом странном вопросе

Почему следующий код подходит для g ++

#include <QObject>

class B {
public:
  B(){}
  ~B(){}
};

class A : public QObject, public B {
  Q_OBJECT
public:
  A(QObject * parent = 0 ) : QObject( parent ), B() {}
  ~A(){}
};

int main(int argc, char *argv[])
{
  A a1();
  //A * a = new A();
  //delete a;
  return 0;
}

и это не может быть скомпилировано

/*... the same class definitions as above */    

int main(int argc, char *argv[])
{
  //A a1();
  A * a = new A();
  delete a;
  return 0;
}

//error: undefined reference to `vtable for A'

Я имею в виду, что делать, чтобы сделать второй товар тоже?

PS Ну, я положил все в отдельных файлах, и он отлично работает. Так что это вопрос макросов Q_OBJECT, я думаю.

Ответы [ 3 ]

3 голосов
/ 10 марта 2012

Если вы определяете производный от QObject класс, создаете приложение и понимаете, что забыли добавить макрос Q_OBJECT и добавили его позже, важно, чтобы вы qmake явно обновили Makefile.Кроме того, для безопасности я рекомендую сделать make clean, чтобы избавиться от старых файлов.make не достаточно умен, чтобы очистить все свои сгенерированные файлы при таких обстоятельствах, и эта проблема часто вызывает головные боли у новых разработчиков Qt.

Для получения дополнительной информации об этом сообщении об ошибке смотрите

http://cartan.cas.suffolk.edu/oopdocbook/html/commonlinkererrors.html#undefinedreftovtable

3 голосов
/ 10 марта 2012

Почему Первый пример правильно компилируется и связывается, а Второй нет?

Первый пример компилируется и ссылается, потому что:
Он не создает объект A,

A a1();

Объявляет функцию a1(), которая не принимает параметров и возвращает тип A.

В то время как Второй пример создает объект, когда вызывается new.

Обратите внимание, что * неопределенная ссылка на vtable for A'* is a linking error and will only be emitted when a object of class A` создана. Следовательно, только второй пример показывает ошибку.

Как решить проблему?
Вам необходимо предоставить определение для всех виртуальных функций, которые вы производите от QObject.

0 голосов
/ 10 марта 2012

Код работает в Vis. Студия. Ваша проблема может заключаться в том, что B не является полиморфным классом - я не знаю, почему это приведет к ошибке - но вы можете попробовать сделать что-то в B virtual: virtual ~B(){}, например.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...