Klassen verwirren mich!



  • Hallo!

    Ich habe eine class CAusgabe definiert die User benachrichtigt usw. Aber das ist eigentlich egal es geht nur ums Prinzip...
    Weiters habe ich eine Klasse, die diese Klasse benutzt. Nun möchte ich aber die class CAusgabe auch im Hauptprogramm benutzen.

    Das funktioniert irgendwie nicht. Ich habe die class CAusgabe nicht nochmal definiert, aber unter Visual c++ kommt immer das: "LNK2005: "class CAusgabe Ausgabe" (?Ausgabe@@3VCAusgabe@@A) already defined in ausgabe.obj

    Um das alles nochmal zu verdeutlichen hier ist mein Code:

    ausgabe.h

    class CAusgabe
    {public: bool bspfunc() };
    

    file.h

    #include "ausgabe.h"
    
    CAusgabe Ausgabe;
    
    class CFile
    {public: void filefunc() };
    

    file.cpp

    #include "file.h"
    
    void filefunc()
    {
      Ausgabe.bspfunc();
    }
    

    main.cpp

    #include "file.h"
    
    { ...
     Ausgabe.bspfunc();
    }
    

    Ich glaub ich hab irgendwie ein flasches Verständnis von Klassen. Es sollte ja schon möglich sein, Klassen von überall aus zu verwenden oder?

    Kann mir das bitte jemand erklären?

    DANKE!

    atzplzw



  • Dies gehört in das C++ Forum



  • Variablen dürfen nicht im Header definiert werden, nur in C ist dies möglich bzw. erlaubt.



  • CAusgabe Ausgabe;
    

    ist im Header falsch so.
    mache daraus im Header

    extern CAusgabe Ausgabe;
    

    und in der main.cpp

    CAusgabe Ausgabe;
    

    - dann sollte iirc gehn.
    PS: der fehler hat nichts, aber auch gar nichts mit klassen zu tun.



  • "Variablen oder Funktionen der Speicherklasse extern teilen dem Compiler mit, dass ihre Definition in einem anderen Modul (Quellcode-Datei) erfolgt als im aktuellen. D.h. als extern deklarierte Daten belegen zunächst einmal keinen Speicherplatz, sondern erst bei ihrer Definition in einem anderen Modul. ..."

    http://home.arcor.de/cpp_kurs/cpp/le07/le07_03.htm#extern



  • Leider funktioniert das nicht so...
    Habe jetzt folgendes:

    main.cpp

    #include "file.h"
    #include "ausgabe.h"
    
    CAusgabe Ausgabe;
    
    { ... 
     Ausgabe.bspfunc(); 
    }
    

    Wenn ich jetzt in file.h

    extern CAusgabe Ausgabe;
    

    definiere erhalte ich verschiedene Fehlermeldungen, wie z.B. 'int Ausgabe' : redefinition
    Wenn ich es in file.cpp mache gibt es noch mehr Fehler. 😕

    atzplzw



  • Setze mal einen include-Schutz bei der Header-Datei ein, Muster:

    #ifndef _NAMEDESHEADERS_H_ 
    #define _NAMEDESHEADERS_H_ 
    
    //... 
    
    #endif
    


  • Erhard Henkes schrieb:

    Setze mal einen include-Schutz bei der Header-Datei ein, Muster:

    #ifndef _NAMEDESHEADERS_H_ 
    #define _NAMEDESHEADERS_H_ 
     
    //... 
    
    #endif
    

    Das Muster ist schlecht. Namen die mit einem Unterstrich gefolgt von einem Großbuchstaben beginnen, gehören der Implementation.

    Also den Unterstrich lieber weglassen.

    Z.B:

    #ifndef NAME_DER_KLASSE_H__INCLUDED
    #define NAME_DER_KLASSE_H__INCLUDED
    ...
    #endif
    


  • HumeSikkins schrieb:

    #ifndef NAME_DER_KLASSE_H__INCLUDED
    

    Das ist aber auch nicht viel besser.



  • Daniel E. schrieb:

    Das ist aber auch nicht viel besser.

    Grund?



  • 17.4.3.1.2
    Jeder Name, der einen doppelten Unterstrich (__) enthält, oder einen mit einem Unterstrich gefolgt von einem Großbuchstaben beginnt, ist der Implementation reserviert. Außerdem ist jeder Name, der mit einem Unterstrich beginnt im globalen Namensbereich und im Namensbereich ::std für die Implementierung reserviert.



  • Daniel E. schrieb:

    HumeSikkins schrieb:

    #ifndef NAME_DER_KLASSE_H__INCLUDED
    

    Das ist aber auch nicht viel besser.

    Ups. Mein Fehler. Ich habe mal wieder meinen Kopf statt den Standard befragt.



  • Ich hab ja echt keine Ahnung wovon Ihr da so alle sprecht, aber ich hab mein Problem so gelöst:

    ausgabe.h

    class CAusgabe
    {
    bspfunc();
    };
    extern CAusgabe Ausgabe;
    

    file.cpp

    #include "ausgabe.h"
    
    CAusgabe Ausgabe;
    
    Ausgabe.bspfunc();
    

    Wenn ich dann in main.cpp

    Ausgabe.bspfunc();
    

    benutze muss ich es nicht mehr definieren. Es funktioniert einfach so, der Compiler beschwert sich auch nicht.
    Es ist mir auch echt egal ob das Standard ist oder nicht hauptsache das Programm läuft...

    atzplzw


Anmelden zum Antworten