是否有可能在同一个.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