Vorwaertsdeklaration bei Membern



  • Sers,

    habe gerade diesen Artikel gelesen:
    http://www.gotw.ca/gotw/007.htm
    und da steht folgendes:

    //---------------------------------------------------------------
        // new file x.h: only TWO includes!
        //
        #include "a.h"  // class A
        #include <iosfwd>
    
        class C;
        class D;
    
        class X : public A {
        public:
                 X        ( const C& );
            D    Function1( int, char* );
            D    Function1( int, C );
            B&   Function2( B );
            void Function3( std::wostringstream& );
            std::ostream& print( std::ostream& ) const;
        private:
            class XImpl* pimpl_;
        };
    
        inline std::ostream& operator<<( std::ostream& os, const X& x )
            { return x.print(os); }
            // NOTE: this does NOT require ostream's definition!
    

    Diese Zeile verstehe ich nicht:

    D    Function1( int, C );
    

    Hier wird C und D benutzt (kein Zeiger oder Referenz), obwohl C.h und D.h NICHT inkludiert wurden, sondern nur eine Vorwaertsdeklaration benutzt wurde. Wieso geht das? Ich dachte eine Vorwaertsdeklaration reicht nur bei Zeigern und Referenzen aus?



  • Ja. Um eine Funktion zu deklarieren, müssen die Parameter- und Rückgabe-Typen nicht vollständig sein. Das müssen die erst sein, wenn man die Funktion aufrufen bzw definieren will.



  • Im Prinzip sind dem Compiler bei Klassendekleration (bei Methoden, Member etc.) die Typen egal, Hauptsache er weiß, dass es diese Typen gibt. Es kommt aber die Einschränkung hinzu, dass der Compiler die Größe der Klasse bestimmen können muss.
    Wenn du also einen Member vom Typ D festlegst, kennt der Compiler nicht die Größe von D und gibt einen Fehler. Ist der Member vom Typ D* gibt es kein Problem, da Zeiger immer die gleiche Größe haben. Entsprechend gilt bei Methoden: diese (und insbesondere deren Parameter- und Rückgabetypen) wirken sich nicht auf die Typgröße aus, sind dem Compiler also erstmal relativ schnuppe.


Anmelden zum Antworten