Wie Sie von einer Klasse in einer anderen Header-Datei erben?
-
05-07-2019 - |
Frage
Ich habe Abhängigkeitsstörungen. Ich habe zwei Klassen: Graphic
und Image
. Jeder hat seine eigene CPP und H-Dateien. Ich erklärte ihnen, wie folgt:
Graphic.h
:
#include "Image.h"
class Image;
class Graphic {
...
};
Image.h
:
#include "Graphic.h"
class Graphic;
class Image : public Graphic {
...
};
Wenn ich zu kompilieren versuchen, erhalte ich folgende Fehlermeldung:
Image.h:12: error: expected class-name before ‘{’ token
Wenn ich die Vorwärts-Erklärung Graphic
von Image.h
entfernen bekomme ich folgende Fehlermeldung:
Image.h:13: error: invalid use of incomplete type ‘struct Graphic’ Image.h:10: error: forward declaration of ‘struct Graphic’
Lösung
Das funktioniert für mich:
Image.h:
#ifndef IMAGE_H
#define IMAGE_H
#include "Graphic.h"
class Image : public Graphic {
};
#endif
Graphic.h:
#ifndef GRAPHIC_H
#define GRAPHIC_H
#include "Image.h"
class Graphic {
};
#endif
Der folgende Code kompiliert ohne Fehler:
#include "Graphic.h"
int main()
{
return 0;
}
Andere Tipps
Sie brauchen nicht Image.h oder vorwärts declare Bild in Graphic.h aufzunehmen - das ist eine zirkuläre Abhängigkeit. Wenn Graphic.h auf irgendetwas in Image.h hängt benötigen Sie, dass in einem dritten Kopf aufzuschlüsseln. (Falls Grafik ein Bildelement, das gerade nicht zur Arbeit gehen.)
Graphic.h muss nicht image.h enthalten, und es muss nicht zu übermitteln, die Image-Klasse deklariert. Auch dann, wenn Image.h nicht brauchen weiterleiten die Grafik Klasse deklarieren, da Sie die Datei # include, die diese Klasse definiert (wie es sein muss).
Graphic.h:
class Graphic {
...
};
Image.h
:
#include "Graphic.h"
class Image : public Graphic {
...
};
Seit Bild Grafik erstreckt, entfernen Sie die Aufnahme von Bild in Ihrer Graphic.h Datei.
Graphic.h
class Graphic {
...
};
Zuerst diese entfernen, müssen Sie immer die vollständige Klassendefinition zur Verfügung, um von einer Klasse zu erben:
class Graphic;
Zweitens Entfernen Sie alle Verweise auf Bild von Graphic.h. Die Eltern müssen in der Regel nicht von seiner Childs kennen.