Klasse in anderem Header verwenden?



  • Hiho,

    vorweg: ich bin mit Klassen & Co. noch nicht so ganz firm, also seht mir bitte nach, falls die Frage sich als allzu trivial herausstellt. 😉

    Als Beispiel habe ich eine Klasse in class.h definiert, die nur eine Variable und zwei Methoden. Mit den zwei Methoden in class.cpp kann diese Variable gesetzt oder gelesen werden:

    //class.h:
    #ifndef class_h
    #define class_h
    
    class Klasse
    {
      public:                              // öffentlich
        Klasse();                      // der Default-Konstruktor
        void setvariable(int i);
        int returnvariable();
      private:                             // privat
        int variable;
    };
    
    #endif /* block_h */
    
    //class.cpp:
    #include "class.h"
    
    //Konstruktor
    Klasse::Klasse()
    {
    }
    
    void Klasse::setvariable(int i){
    	variable = i;
    }
    
    int Klasse::returnvariable(){
    	return variable;
    }
    

    Im Hauptprogramm main.cpp habe ich dann class.h inkludiert und kann dann innerhalb der Main-Routine problemlos Instanzen der Klasse erschaffen/ Methoden anwenden etc:

    #include <stdio.h>
    #include "class.h"
    //#include "def.h"
    
    int main( int argc, const char* argv[] ) {
    Klasse Testklasse;
    Testklasse.setvariable(5);
    int v1 = Testklasse.returnvariable();
    //int v2 = Testklasse2.returnvariable();
    printf("%d \n",v1);
    system("pause");
    }
    

    So weit, so gut.
    Nun würde ich jedoch gerne schon Member dieser Klasse außerhalb der Main-Routine in einem anderen Header definieren.
    Dazu wollte ich den Header "def.h" inkludieren (oben auskommentiert), der so aussieht:

    #include "class.h"
    
    #ifndef def_h
    #define def_h
    
    Klasse Testklasse2;
    Testklasse2.setvariable(5);
    
    #endif
    

    Das funktioniert allerdings nicht, da ich wohl so nicht auf Testklasse2 zugreifen kann. Entferne ich diese Zeile, so dass nur noch die Deklaration erscheint, funktioniert es. Allerdings hatte ich auch keinen Erfolg, die "Testklasse2.setvariable(5)"-Zeile in einer zugehörigen def.cpp-Datei unterzubringen. Was mache ich falsch?

    Vielen Dank im voraus 🙂
    Mfg Angu



  • Angura schrieb:

    #include "class.h"
    
    #ifndef def_h
    #define def_h
    
    Klasse Testklasse2;
    Testklasse2.setvariable(5);
    
    #endif
    

    Im globalen Namensraum kannst du nicht einfach Anweisungen hinschreiben. Diese müssen immer innerhalb einer Funktion stehen. Ich denke also, dass du eher eine Funktion definieren willst, welche auf Klasse zugreift.

    Und umhülle die #include -Direktiven mit deinen Header-Guards.



  • Hi, danke für deine Antwort!
    Ich habe jetzt also versucht in "def.h" eine Funktion set() zu definieren, die dann auf die Klasse zugreifen soll.

    #ifndef def_h
    #define def_h
    #include "class.h"
    
    Klasse Testklasse2;
    void set();
    
    #endif
    

    In "def.cpp" habe ich dann die Methode (erst einmal eine leere Funktion) reingeschrieben.

    #include "def.h"
    
    void set(){
    };
    

    Doch wenn ich das kompilieren will, erhalte ich den Linker-Fehler:

    def.obj : error LNK2005: "class Klasse Testklasse2" (?Testklasse2@@3VKlasse@@A) ist bereits in main.obj definiert.

    Doppelte Definition? Aber ich habe doch in def.h lediglich eine Instanz dieser Klasse definiert, oder nicht?

    Danke für die Hilfe!
    mfg angu



  • Hi,

    dazu mußt du in der Header Datei die Variable mittels "extern" deklarieren (und dann in der Source-Datei die eigentliche Definition der Variablen hinschreiben).
    Stichwort: One definition rule (ODR)



  • Klüger ist es aber, auf die globale Variable zu verzichten. Deklariere sie in einer Funktion und gib falls nötig Referenzen oder Zeiger darauf weiter, dann ersparst du dir einige Probleme.



  • Und da kommt auch schon wieder mein Link 😃 :
    http://www.c-plusplus.net/forum/p1993089#1993089


Anmelden zum Antworten