2010-12-06 10 views
5

Ich habe ein Klassen-Setup und von dieser Klasse verwende ich Vererbung.C++ ungelöst externes Symbol

In Datei ah

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

In Datei bh:

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

Und in b.cpp

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

In der Hauptdatei ich beide bin auch diese Dateien:

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

Noch bekomme ich ein ungelöstes Symbol für die virtuelle Funktion drucken. Die Datei a.obj wird als die Datei angezeigt, die den Fehler erzeugt. Was mache ich falsch? Wenn ich b.cpp in b.h unterhalb der Klassendefinition verschiebe, funktioniert es gut.

Antwort

9

Sie haben eine Implementierung für b :: print, aber nicht für a :: print. Was würde passieren, wenn ein Objekt der Klasse a instanziiert und print() darauf aufgerufen würde? das heißt

a o; 
o.print(); 

b :: Drucküberschreibt ein :: Druck aber Sie müssen noch eine Implementierung eines :: Druck haben (es sei denn Sie es rein virtuelle machen).

machen Druck rein virtuell in ein, definieren Sie es wie folgt aus:

virtual void print() = 0; 

Wenn eine Klasse rein virtuelle Funktionen verfügt, können Sie keine Objekte dieser Klasse instanziiert. Sie müssen von dieser Klasse ableiten und eine Implementierung aller reinen virtuellen Funktionen bereitstellen, bevor Sie eine Klasse haben, die tatsächlich instanziiert werden kann.

+0

Meine Vermutung, das ist es, obwohl die OP nicht wirklich genug Informationen zur Verfügung stellte sicher sein. –

+0

Was bedeutet rein virtuell? –

+0

Ah ich habe es. Ich musste am Ende der virtuellen Deklarationen = 0 hinzufügen. http://en.wikipedia.org/wiki/Virtual_function#C.2B.2B_2 für zukünftige Zuschauer. Vielen Dank. –

1

Es könnte ein Tippfehler sein, aber in b.cpp haben Sie die print() Funktion in einer Klasse namens Add anstelle der b Klasse implementiert.

+0

Vielen Dank für die Notiz, es war ein Tippfehler. (Tippfehler in SO, echtes Problem immer noch gleich) –

+0

ok - ich denke @ Ferruccios Antwort könnte dann der richtige Weg sein –

0

Ich glaube, Sie brauchen ein Semikolon am Ende der Klasse Schnittstelle

Verwandte Themen