5 Stimmen

C++ nicht aufgelöstes externes Symbol

Ich habe eine Klasse eingerichtet, und von dieser Klasse aus verwende ich die Vererbung.

In der Datei a.h

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

In der Datei b.h:

#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 sind diese beiden Dateien enthalten:

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

Ich erhalte jedoch ein nicht aufgelöstes Symbol für die virtuelle Funktion print. Die Datei a.obj ist als die Datei aufgeführt, die den Fehler verursacht. Was mache ich falsch? Wenn ich b.cpp in b.h unterhalb der Klassendefinition verschiebe, funktioniert es gut.

9voto

Ferruccio Punkte 96076

Sie haben eine Implementierung für b::print, aber nicht für a::print. Was würde passieren, wenn Sie ein Objekt der Klasse a instanziieren und print() darauf aufrufen?

a o;
o.print();

b::print überschreibt a::print, aber Sie müssen immer noch eine Implementierung von a::print haben (es sei denn, Sie machen es rein virtuell).

um den Druck in a rein virtuell zu machen, definieren Sie ihn wie folgt:

virtual void print() = 0;

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

1voto

Jarod Elliott Punkte 15024

Es könnte sich um einen Tippfehler handeln, aber in b.cpp Sie haben die print() Funktion innerhalb einer Klasse namens Add und nicht die b Klasse.

0voto

Y.H. Punkte 2458

Ich denke, Sie brauchen einen Doppelpunkt am Ende der Klassenschnittstelle

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X