동일한 .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'
는 여기 선언을 떠나, 또는 내가 헤더 파일을 생성하고 해당 파일에 선언을 이동해야합니다 수 있습니까?
편집 :
#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;
};
: 씨 제리 관 때문에 나는 그래서 우리는 그 가능성을 검토 할 수 AbstractConnection의 선언 여기에 넣어 것입니다, 일부 가상 함수가 구현이되지 않을 수 있습니다 것을 제안합니다 (씨 관 감사합니다)
해결 방법 : @ JCooper, @ iammilind 및 @Jerry Coffin에게 감사드립니다. AbstractConnection에서 소멸자를 제거한 후에 (실제로 아무것도 수행하지 않기 때문에) ConnectionMockup에서 Q_OBJECT를 제거하면 작동합니다.
감사합니다. 나는 지금 그것을 교정했다. – Sasa
@Sasa : 첫 번째 문장을 명시 적으로 수정하지 않았습니다. 선언 및 구현은 여기에서 동의어입니다. ;) – Xeo
@ 0A0D : 사실, 그렇지 않습니다. 클래스 선언은 다음과 같습니다 : class myclass;'class myclass {/ * ... * /};'는 클래스 정의입니다. 그런 다음 클래스 구성원을 클래스 자체의 정의와 별도로 정의 할 수 있습니다. –