Можно ли иметь объявление и реализацию класса в одном и том же файле .cpp?
Я хочу провести модульное тестирование с помощью фиктивного объекта.Вот пример моего теста:
// Some includes removed
#include "abstractconnection.h"
class ConnectionMockup : public AbstractConnection
{
Q_OBJECT
public:
explicit ConnectionMockup(QObject *parent = 0);
bool isReady() const;
void sendMessage(const QString &message);
void test_send_message(const QString &message);
bool ready;
QStringList messages;
};
ConnectionMockup::ConnectionMockup(QObject *parent)
: AbstractConnection(parent)
{
ready = true;
}
bool ConnectionMockup::isReady() const
{
return ready;
}
void ConnectionMockup::sendMessage(const QString &message)
{
messages.append(message);
}
void ConnectionMockup::test_send_message(const QString &message)
{
emit messageRecieved(message);
}
TestEmcProgram::TestEmcProgram(QObject *parent) :
QObject(parent)
{
}
void TestEmcProgram::open()
{
ConnectionMockup mockup;
EmcProgram program(&mockup);
QCOMPARE(...
...
...
Как видите, класс ConnectionMockup используется только классом TestConnection, и он мне больше нигде не нужен.Итак, когда я пытаюсь скомпилировать эту программу, я получаю следующую ошибку:
> testemcprogram.o: In function
> `ConnectionMockup':
> /home/sasa/Desktop/QtPro/FocoKernel-build-desktop/../FocoKernel/testemcprogram.cpp:29:
> undefined reference to `vtable for
> ConnectionMockup'
> /home/sasa/Desktop/QtPro/FocoKernel-build-desktop/../FocoKernel/testemcprogram.cpp:29:
> undefined reference to `vtable for
> ConnectionMockup' testemcprogram.o: In
> function `~ConnectionMockup':
> /home/sasa/Desktop/QtPro/FocoKernel-build-desktop/../FocoKernel/testemcprogram.cpp:14:
> undefined reference to `vtable for
> ConnectionMockup'
Можно ли оставить здесь объявление или мне нужно создать заголовочный файл и переместить объявление в этот файл?
РЕДАКТИРОВАТЬ: Поскольку г-н Джерри Коффин (спасибо, г-н Коффин) предположил, что у меня могут не быть реализованы некоторые виртуальные функции, я помещу здесь объявление AbstractConnection, чтобы мы могли рассмотреть эту возможность:
#include <QObject>
class AbstractConnection : public QObject
{
Q_OBJECT
public:
explicit AbstractConnection(QObject *parent = 0);
virtual ~AbstractConnection();
virtual bool isReady() const = 0;
signals:
void messageRecieved(const QString &message);
public slots:
virtual void sendMessage(const QString &message) = 0;
};
РЕШЕНИЕ: Благодаря @JCooper, @iammilind и @Jerry Coffin у нас есть решение.После удаления деструктора из AbstractConnection (поскольку он фактически ничего не делает) и удаления Q_OBJECT из ConnectionMockup он работает.