2010-12-06 23 views
5

Tengo una configuración de clase y de esa clase estoy usando la herencia.C++ símbolo externo no resuelto

En archivo ah

class a 
{ 
public: 
    virtual void print(); 
}; 

En bh archivo:

#include "a.h" 
#include <iostream> 
class b: public a 
{ 
public: 
    void print(); 
}; 

Y en b.cpp

#include "a.h" 
#include "b.h" 
void b::print(){}; 

En el archivo principal Estoy incluyendo ambos archivos:

#include "a.h" 
#include "b.h" 

Sin embargo, aparece un símbolo no resuelto para la impresión de la función virtual. El archivo a.obj aparece como el archivo que genera el error ¿Qué estoy haciendo mal? Si muevo b.cpp hacia b.h debajo de la definición de clase, funciona bien.

Respuesta

9

Tiene una implementación para b :: print pero no para una :: impresión. ¿Qué pasaría si crea una instancia de un objeto de clase a y se llama print() en él? es decir,

a o; 
o.print(); 

b :: impresión se impone a una :: impresión, pero que todavía tiene que tener una implementación de un :: impresión (a menos que sea pura virtual).

para hacer de impresión virtual pura en una, lo definen así:

virtual void print() = 0; 

Cuando una clase tiene funciones virtuales puras, no se puede crear instancias de objetos de esa clase. Debe derivar de esa clase y proporcionar una implementación de cualquier función virtual pura antes de tener una clase que realmente pueda crearse una instancia.

+0

Mi conjetura esto es que a pesar de que el PO en realidad no proporciona suficiente información para estar seguro. –

+0

¿Qué significa virtual puro? –

+0

Ah, lo tengo. Tuve que agregar = 0 al final de las declaraciones virtuales. http://en.wikipedia.org/wiki/Virtual_function#C.2B.2B_2 para futuros espectadores. Gracias. –

1

Puede ser un error tipográfico, pero en b.cpp ha implementado la función print() dentro de una clase llamada Add en lugar de la clase b.

+0

Gracias por anotar, fue un error tipográfico. (error al escribir en SO, problema real sigue igual) –

+0

ok - creo que la respuesta de @Ferruccio podría ser el camino a seguir entonces –

0

Creo que se necesita un punto y coma al final de la interfaz de la clase

Cuestiones relacionadas