Помещение объявления класса в файл .cpp

Можно ли иметь объявление и реализацию класса в одном и том же файле .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 он работает.

19
задан Sasa 14 April 2011 в 03:32
поделиться