Forward Declaration bei inneren privaten Klassen/Strukturen



  • Hallo zusammen,

    durch Foward Declaration und including im Cpp kann man ja die Compilezeit verringern. Bei Klassen bzw. Members funktionieren das natürlich nicht.

    An manchen Stellen innerhalb einer Klasse verwende ich Hilfsklassen oder Strukturen. Strukturen sind für mich reine Datenklassen die Werte transportieren. Das ist mir eingefallen, da ich diese nicht als Member verwende sondern nur als Parameter oder Return Werte, dass ich diese inneren Klassen und Strukturen als Forward Declaration im hpp deklarieren könnte und erst im Cpp definieren könnte.

    Dadurch würde das erweitern der Datenklasse die Klassen, die meine Klasse inkludieren oder als Member verwenden, nicht so stark beeinflussen im Kontext des Compilieren.

    Würde etwas dagegen sprechen es so handzuhaben oder hat es eher mehr Vor- als Nachteile?



  • Bin nicht sicher ob ich es 100% richtig verstehe, aber ich würde sagen das klingt vernünftig.



  • Ein kurzes Beispiel damit es klar ist:

    hpp:

    #pragma once
    
    class TestClass
    {
    private:
    	class TestInnerClass;
    	void DoSomething(
    		const TestInnerClass& val
    	)const;
    public:
    };
    

    cpp:

    #pragma once
    #include "TestClass.hpp"
    #include <string>
    
    class TestClass::TestInnerClass
    {
    	std::string Wert;
    };
    
    void TestClass::DoSomething(
    	const TestInnerClass& val
    )const
    {
    	//nothing
    }
    

    Wenn ich die innere private Klasse erweitere, sollten die Klassen, die meine Klasse im hpp inkluden, nicht betroffen sein bzgl. des Compilieren.


  • Gesperrt

    Du kannst Klassen auch vorwärtsdeklarieren, musst dann aber so ein Konstrukt schreiben:

    class A;
    
    class A {
    public:
        // something; (Entweder nur Deklarierung oder direkt die Implementierung)
    };
    
    inline void A::... // Hier die Implementierung
    


  • @nameName
    Ich bin kein Freund von inline Funktionen. Dadurch wird die gesamte Funktion im Header definiert und wenn man diese anpasst, erzeugt das ein recompile aller Klassen die diese Klasse inkludieren.



  • @KK27 OK, ja, dann hatte ich es richtig verstanden. Ja, sicher, das macht Sinn.

    Es ist mM. generell eine gute Idee Dinge aus Headerfiles rauszuhalten die nicht benötigt werden. Also auch wenn du eine struct/class hast die als Parameter oder Returnwert einer public Funktion benötigt wird, macht es oft Sinn nur eine forward-declaration zu machen.
    Denn nicht überall wo eine vollständige Definition der Klasse benötigt wird muss man alle Memberfunktionen dieser Klasse aufrufen.



  • @hustbaer
    Eine Forward Declaration ist doch normalerweise bei einer inneren Klassen/Struktur nicht möglich außer bei meinem Beispiel oder? Soweit ich weiß sind Forward Declarations bei public inneren Klassen/Strukturen nicht möglich.

    Ansonsten habe ich mir angewöhnt, soweit wie möglich Forward Declarations zu machen.



  • @KK27
    Richtig, eine forward-declaration einer nested class ist nur möglich, während die äussere Klasse definiert wird. Also nur so wie in deinem Beispiel.
    Das ist auch ein mMn. wichtiger Nachteil von nested classes.
    Daher mache ich oft gerne Foo und FooParams statt Foo und Foo::Params.


Anmelden zum Antworten