Forward Declaration einer Subklasse
-
Angenommen ich habe eine Klasse, die ich in einer anderen Klasse benutzen will. Dann kann ich die Klasse einfach mit #include in der Header-Datei einbinden oder aber ich binde sie erst in der CPP-Datei ein und mache eine Forward Declaration.
So z.B.Header:
namespace myNamespace { class myClass; }CPP:
#include "myPackage/include/myClass.h"Angenommen ich habe nun eine Klasse MyClass1::MySubClass1, die ich in einer Header-Datei als Forward-Deklaration einfügen will. Wie mache ich das? Mir fällt nur die Lösung ein, direkt in der Header-Datei
#include "myPackage/include/fileOfMySubClass1.h"
-
Das ist leider nicht möglich, ich hätte das auch schon benötigt. Hier gab es eine Diskussion zu diesem Thema.
Grundsätzlich hast du drei Möglichkeiten:
- Zusätzliche Abhängigkeit durch Inkludieren des Headers in Kauf nehmen
- Typinformation mit
void*über Bord werfen - Verschachtelte Klasse entschachteln und als eigenständigen Typen realisieren
Ich rate dir zur dritten Möglichkeit.
-
Die 3. Möglichkeit finde ich auch am Besten, leider darf ich an diesem Code nichts ändern, da es nicht meiner ist.
Die 2. Möglichkeit hätte zur Folge, dass ich an allen Stellen wo mit Zeigern auf Variablen des verschachtelten Typs gearbeitet wird, einen Cast vornehmen müßte. Rein interessehalber: Müßte das dann ein normaler C-Cast sein oder sollte man da besser einen anderen Cast nehmen?
Ich werde wohl aus pragmatischen Gründen die 1. Möglichkeit verwenden müssen.
-
gentlesea schrieb:
Rein interessehalber: Müßte das dann ein normaler C-Cast sein oder sollte man da besser einen anderen Cast nehmen?
All das, was Du mit einem C-style cast machen kannst, kannst Du auch mit einem C++-Cast machen. Der Unterschied ist der, dass man beim C++-Cast sofort auf dem ersten Blick sieht, was der eigentlich machen soll, wobei ein C-style cast "alles" machen kann -- von einfachen und relativ sicheren statischen casts bis zu den gefährlichen const- und reinterpret casts. Hier würde ein static_cast reichen. Da die Typinformation mit void verloren geht, ist es wichtig, dass der Zeigertyp hinterher wieder derselbe ist:
T * --> void * --> T* oder T const* --> void const* --> T const*und nicht so etwas:
Derived * --> void * --> Base * (Pfui!)Gruß,
SP