是否有可能在同一個.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中移除析構函數(因爲它實際上什麼都不做)並從ConnectionMockup中移除Q_OBJECT它就起作用。
謝謝。我現在用文字糾正了它。 – Sasa 2011-04-14 01:42:07
@Sasa:我明確沒有糾正第一句話。聲明和實現在這裏是同義詞。 ;) – Xeo 2011-04-14 01:53:21
@ 0A0D:其實不,不是。類聲明如下所示:'class myclass;'類似於:'class myclass {/ * ... * /};'是一個類定義。然後,可以從類自身的定義中分別定義類成員。 – 2011-04-14 01:55:20