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

Почему следующий код подходит для 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.

1
Dmitriy Kachko 10 Мар 2012 в 09:39

3 ответа

Лучший ответ

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

Для получения дополнительных сведений об этом сообщении об ошибке см.

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

3
shofee 10 Мар 2012 в 05:50

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

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

A a1();

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

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

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

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

3
Alok Save 10 Мар 2012 в 05:48

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

0
tmpearce 10 Мар 2012 в 05:53