Mehrfache Deklaration bei Objekten von Klassen umgehen



  • manni66 schrieb:

    Vermutlich sieht der Code, der den Fehler produziert, auch ganz anders aus. Mit den Includeguards dürfte im Beispielcode kein Fehler mehr auftreten. Im echten Leben wird es dennoch Probleme geben, da du nicht nur eine Klasse sondern auch eine Variable definierst. Das ist aber nur einmal erlaubt. Wenn du den Header also in 2 verschiedenen cpp benutzt, wirst du einen Fehler erhalten.

    Und was mach ich jetzt? Wie löse ich das?



  • kralo9 schrieb:

    Und was mach ich jetzt? Wie löse ich das?

    Warum definierst du die Variablen im Header?



  • Also soll ichs nochmal probieren ohne die variablen in der klasse stehen zu haben?



  • kralo9 schrieb:

    Also soll ichs nochmal probieren ohne die variablen in der klasse stehen zu haben?

    Ohne sie im Header stehen zu haben.



  • Ok ich werds dann gleich morgen ausprobieren 😉



  • Globale Variablen solltest du dir eh nach Möglichkeit verkneifen.

    Warum auch die include-Quards dein Problem nicht gelöst haben: Wenn du den Header in mehr als einer Übersetzungseinheit einbindest, erscheint die Definition der Variablen auch in entsprechend vielen Übersetzungseinheiten. Du müsstest statt der mehrfachen Definition der Klasse jetzt einen Fehler wegen Mehrfacher Definition der Variable beim Linken bekommen, weil die Variable weder static noch const noch in einem anonymen Namespace definiert wird (d.h. sie hat externe linkage).

    Leider hast du uns wie so viele nicht alle nötigen Infos gegeben (z.B. Fehlermeldungen) und wir müssen raten. Siehe auch die Links in meiner Signatur.



  • Also ich hab jetzt nochmal die Variablen im Header auskommentiert zum Testen. Trotzdem erscheint der Fehler. Vielleicht sollte ich noch anmerken, ich muss wohl eher 😞 , dass der Compiler mir den Fehler ausspuckt, dass die Objektnamen, also gui und guiButton, mehrfach deklariert werden.

    Anbei nochmal der Code:

    #ifndef GUI_H_
    #define GUI_H_
    
    struct GUI
    {
    protected:
    	GLuint base;
    public:
    
    	void initGUI();
    
    } gui; // FEHLER!
    
    struct Button
    {
    protected:
    	int buttonHeight;
    	int buttonWidth;
    	int buttonColor;
    public:
    
    	void setButtonHeight(int h);
    	void setButtonWidth(int w);
    	void setButtonColor(const char color);
    	void setButton(int width, int height, const char color);
    	void drawButton(int pos_x, int pos_y, const char text);
    } guiButton; // FEHLER!
    
    #endif /* GUI_H_ */
    

    Hab die zwei Zeilen mit Kommentar markiert, wo der Fehler erscheint...

    Problem jetzt ist, dass ich eine Klasse verwenden will. Aber wenn ich die Objekte einzeln in den cpp files definiere, dann benutzen sie ja verschiedene Variablen, sie haben zwar den selben Namen aber sind dennoch getrennt, weil obj1.variable nicht gleich obj2.variable ist.

    Wie löse ich das jetzt?

    Fehlercodes:

    first defined here	
    multiple definition of `gui'	
    multiple definition of `guiButton'
    


  • das wurde doch schon mehrfach geschrieben: du sollst keine globalen Variablen erzeugen. Streiche "gui" und "guiButton", dann klappts auch mit dem Compiler



  • Nur nochmal zur Klarstellung, da hier eher ein Verständnisproblem Objekt<->Klasse vorzuliegen scheint:
    Du erzeugst mit "struct GUIButton { ... } guiButton" nicht nur eine Klasse GUIButton, sondern auch ein Objekt dieser Klasse mit dem Namen "guiButton". Da Deine GUI sicherlich mehr als nur einen Button haben soll, ist das doch sicher nicht gewollt?



  • LordJaxom schrieb:

    "struct GUIButton { ... } guiButton" nicht nur eine Klasse GUIButton

    streng genommen erzeugt er keine Klasse, sondern ein Struct.



  • daddy_felix schrieb:

    streng genommen erzeugt er keine Klasse, sondern ein Struct.

    Bis auf die Default-Sichtbarkeit sind class und struct in C++ identisch 😉



  • Nun gut, da es anscheinend nicht so funktioniert wie ich wollte, werde ich das mit mehreren Objekten machen. Wird vielleicht etwas umständlicher, aber ich denke ich werds schon schaffen 🙂

    Danke für eure tolle Hilfe!

    mfg


Anmelden zum Antworten