Warum ist C++ so doof und lässt mich Header nicht gegenseitig inkludieren&nutzen?



  • [C++-bashing gelöscht]



  • Es scheint dir nicht bewusst zu sein, aber #include ist dafür da, die angegebene Datei genau an der jeweiligen Stelle einzufügen.
    Das Problem sollte offensichtlich sein, wenn zwei Dateien versuchen, sich gegenseitig einzubinden. #pragma once verhindert, dass dieselbe Datei mehr als einmal in der Übersetzungseinheit eingebunden wird.

    Die Lösung ist aber einfach und nennt sich forward declaration.
    Statt den Class1-Header in Class2.h einzubinden, schreibst du class Class1; und die Existenz der Klasse ist ab sofort bekannt. Die Verwendung von Referenzen und Zeigern erfordert es auch nicht, dass die vollständige Deklaration von Class1 bekannt ist.



  • Es ist völlig korrekt das der Compiler dir nicht die Möglichkeit gibt. Es ist auch kein Fehler, sondern physikalisch unmöglich! Denn bei deinem Fall muß zu jedem Zeitpunkt die komplette Typ-Definition des jeweils anderen Value-Objekt vorhanden sein. Das geht aber real garnicht.

    Du hast deshalb folgende Möglichkeit:
    Benutze in einer der Klassen Referenzen oder Pointer, denn die verlangen keine Definition. Dann kannst du eine Forward-Deklaration benutzen. Bsp:

    #pragma once
    
    class Class2; // Forward declaration
    
    class Class1
    {
        Class2 &class2; // hier eine Referenz. Alternativ auch Pointer oder besser Smartpointer möglich
    };
    
    // In der Class1.cpp-Datei kannst/mußt du jetzt Class2.h inkludieren!!!
    

    Angeblich soll man auch Forward Declarations bei Value-Objekten nutzen können. Habe ich aber bisher nicht ausprobiert.



  • [C++-bashing gelöscht]



  • zustimmer schrieb:

    [C++-bashing gelöscht]

    Der OP hat eine Aussage auf Grund von Unwissenheit getätigt. Deine Wiederholung dieser Aussage wird dadurch nicht richtig.

    Zum Thema: Die anderen Sprachen haben das Thema nicht, weil sie keine Value-Objekte zulassen! Die sogenannten "modernen" Sprachen wie Java, C# usw. kennen nur Referenzen! Und deren "Import"-Anweisung ist vergleichbar mit einem Forward-Declaration. Wenn diese Sprachen auch Value-Objekte kennen würden, hätten sie die selben Schwierigkeiten! So wird ein Schuh draus.

    Wenn man das gleiche Verhalten/Einfachheit haben will, sollte man in C++ auf Smart-Pointer setzen und somit die Objekte auf dem Freestore anlegen, so wie es die "modernen" Sprachen durchgängig vom Anwender erzwingen. C++ verlangt das nicht, erlaubt halt mehrere Designs. Und es gibt ja shared_ptr<T> im C++-Standard, um einfach mit Freestore-Objekten zu arbeiten, wenn man kein Value-Objekt will.


Anmelden zum Antworten