Mehrfache Deklaration bei Objekten von Klassen umgehen
-
Hallo liebe Comm,
ich habe das Problem, dass ich ein Objekt einer Klasse, dadurch, dass ich die Header-Datei mehrfach "include", mehrfach deklariere.
Vielleicht zum besseren Verständis ein Beispiel:
header1.h:
struct Klasse1 { public: void func1(); }klasse1;header2.h:
#include "header1.h" struct Klasse2 { public: void func2(); }klasse2;main.cpp
#include "header1.h" #include "header2.h" void main(){ ... }Hier wurde jetzt header1.h 2 mal includiert. Es erscheint der Fehler, dass es doppelt deklariert wurde. Aber die Klasse aus header1.h muss in header2.h und in main.cpp verwendet werden!!!
Wie umgehe ich das am geschicktesten? Hoffe ihr habt mein Problem verstanden

Danke im Voraus
mfg
-
Du suchst das Stichwort http://de.wikipedia.org/wiki/Include_Guard.
Viele Grüße,
MJM
-
header1.h:
#ifndef HEADER1_H #define HEADER1_H //Beginn Header1.h struct Klasse1 { public: void func1(); }klasse1; //Ende Header1.h #endif
-
Noch ein Hinweis:
void main() ist falsch. Das heißt du lernst wahrscheinlich aus veralteten Quellen.
Der Rückgabetyp von main MUSS int sein.
-
KMT schrieb:
Noch ein Hinweis:
void main() ist falsch. Das heißt du lernst wahrscheinlich aus veralteten Quellen.
Der Rückgabetyp von main MUSS int sein.ja das hab ich als beispiel aus dem kopf getippt und weil ich diese funktion nie schreibe, sie ist ja standardmäßig schon da, hab ich sie mal falsch geschrieben

ich werde mir den wikipedia beitrag mal anschauen vielleicht hiflt der..
meld mit dann wieder
mfg
EDIT: also der wikipedia beitrag erklärt dieses #ifndef und #pragma once und, nun ja... ifndef ist dabei aber trotzdem kommt dass es doppelt deklariert ist

-
Sorry für Doppelpost

Habe jetzt beides ausprobiert, einmal seperat und dann nochmal gleichzeitig! Immer wieder kommt der Fehler...
Woran liegt's?EDIT:
momentan mein header:
#ifndef GUI_H_ #define GUI_H_ struct GUI { protected: GLuint base; public: void initGUI(); } gui; 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; #endif /* GUI_H_ */
-
kralo9 schrieb:
ja das hab ich als beispiel aus dem kopf getippt
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.
-
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