¿Es posible tener declaración de clase e implementación en el mismo archivo .cpp?Poner declaración de clase en el archivo .cpp
Quiero hacer algunas pruebas unitarias con la ayuda de un objeto simulado. Aquí está un cierto ejemplo de mi prueba:
// 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(...
...
...
Como se puede ver, el ConnectionMockup clase sólo se utiliza por TestConnection clase, y yo no lo necesita en otro sitio. Por lo tanto, cuando intento compilar este programa, consigo el error siguiente:
> 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'
¿Es posible salir de declaración aquí, o tengo que crear el archivo de cabecera y mover declaración a ese archivo?
EDIT: Dado que el Sr. Jerry Ataúd (Gracias Sr. Ataúd) sugirió que quizá no tenga algunas funciones virtuales implementadas, voy a poner aquí declaración de AbstractConnection para que pudiéramos revisar esa posibilidad:
#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;
};
SOLUCIÓN: Gracias a @JCooper, @iammilind y @Jerry Coffin tenemos la solución. Después de eliminar el destructor de AbstractConnection (ya que en realidad no hace nada) y eliminar Q_OBJECT de ConnectionMockup, funciona.
Gracias. Lo corregí en el texto ahora. – Sasa
@Sasa: explícitamente no corrigí la primera oración ... la declaración y la implementación son sinónimos aquí. ;) – Xeo
@ 0A0D: En realidad, no, no lo es. Una declaración de clase se ve así: 'clase myclass;' Algo así como: 'clase myclass {/ * ... * /};' es una definición de clase. Luego puede definir los miembros de la clase por separado de la definición de la clase en sí. –