Начнем по порядку. Имеется описание некого класса, отвечающего за визуальное оформление программы.
#include <QtGui>
class Windows : public QObject
{
protected:
friend class MyClass;
QPushButton *but1;
QPushButton *but2;
public:
Windows(QApplication *App);
QPushButton *RUN;
}
В конструкторе этого класса производится инициализация всех полей. QApplication*App нужен для того, чтобы через сигнал нажатия кнопки “Close” произвести закрытие приложения.
Далее идет описание дружественного класса, в котором будет наблюдаться агрегирование ранее описанного класса по значению (композиция).
#include <windows.h>
#include <QFile>
#include <cstdlib>
class MyClass : public QObject
{
Q_OBJECT
private:
int number_of_lines;
public:
MyClass (QApplication*App);
Windows *win; // Объект, отвечающий за визуализацию
public slots:
void myFunc();
}
Определение этого класса выглядит следующим образом:
MyClass:: MyClass (QApplication *App) // Конструктор
{
win = new Windows (App);
}
void MyClass::myFunc()
{ }
В теле основной программы main.cpp содержится следующее:
#include "myclass.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyClass *c1 = new MyClass (&app);
QObject::connect(c1->win->RUN, SIGNAL(clicked()),
c1, SLOT(myFunc()));
return app.exec();
}
Тоесть, при нажатии кнопки RUN в окне программы, должна (по идее) запускаться функция myFunc() из объекта c1.
Когда в редакторе я запускаю компиляцию, то получаю следующую ошибку:
In function “MyClass”:
undefined reference to “vtable for Compiler”
(здесь ссылка на конструктор класса MyClass)
undefined reference to “vtable for Compiler”
(дублирует)
collect2: returned 1 exit statusПрошу помощи в решении данной проблемы. Уже пытался решить ее подобным способом месяц назад, но встретив такую ошибку, бросил эту затею. Работу продолжал по принципу: в main.cpp не ставил никаких связей, а напрямую вызывал функцию (не слот) из объекта:
#include "myclass.h"
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
MyClass *c1 = new MyClass (&app);
c1->myFunc();
}
Тоесть программа начинала перед запуском работать с функцией, а при нажатии кнопки RUN просто показывала окно с содержимым результата.