Struct Probleme
-
Hallo miteinander,
ich fange an zu verzweifeln. Ich bin gerade dabei mich mit Structs zu beschäftigen, doch ich krieg und krieg es einfach nicht gebacken. Deshalb hoffe ich bei Euch (mal wieder
) Hilfe zu finden 
Folgendes: Ich benutze viele Klassen in meinem Projekt. Alle mit eigener .h und .cpp. Diese Klassen verarbeiten Daten, von denen ich zum jetzigen Zeitpunkt leider noch nicht genau weiß, wie diese Aussehen werden. Damit ich dann aber nicht wieder in jede einzelne Klasse gehen muss, wollte ich das mittels Structs lösen. So dass jede Klasse ihre/n Struct/s hat, von denen sie sich die Daten holen und ich dann später nur noch in den Structs selbst die Daten reinschreibe, die ich dann kriege. Erstmal verständlich soweit? Ich hoffe ich habe nicht bereits hier einen Denkfehler.
Ich habe leider nicht viel zur genauen Struktur zur Anlegung von Structs gefunden. Ich wollte nun in einer struct.h die Structs deklinieren und in einer struct.cpp in einer Funktion definieren. Die struct.h kriegt dann jede Klasse und die main.cpp inkludiert. Zusätzlich kriegt die main.cpp einen Prototypen meiner "Struct"-Funktion und den Befehl diese auszuführen, damit die Daten dort aktualisiert werden und die Klassen ihre Arbeit verrichten können. So viel dazu.
Vielleicht habe ich aber einfach auch ein falsches Verständnis von Structs in Headern. Oder kommen die da gar überhaupt nicht rein? Irgendwo habe ich glaube ich diesbezüglich ein gewaltiges Verständisproblem oder (hoffentlich nur) einen Knoten im Hirn.
Mittlerweile in der gefühlt 1000. Version angelangt, jedoch egal was und wie ich es versuche, entweder habe ich Mehrfachdefinitionen, fehlende Definitionen/Deklarationen oder (im aktuellen Codeauszug) nicht aufgelöste externe Symbole (meine Lieblingsfehlermeldung, mit der ich am wenigsten anfangen kann).
Hier mal ein kleiner Auszug:
//structs.h extern struct ABC s_xyz; //Structs //====Allgemein //==ABC struct ABC { bool fail; }; //structs.cpp #include "structs.h" void setLabels() { ABC s_xyz; s_xyz.fail = true; } //Ebene3.h #include "structs.h" extern struct ABC s_xyz; class Ebene3 { Ebene3(ABC &s_xyz); void draw(ABC &s_xyz); }; //Ebene3.cpp #include "Ebene3.h" Ebene3::Ebene3(ABC &s_xyz) { //bla } //Ebene2.h #include "../Ebene1.h" class Ebene2 { //glaube hier jetzt nicht so wichtig }; //Ebene2.cpp #include "Ebene2.h" Ebene2::Ebene2() { Element = new Ebene3(s_xyz); Element->draw(s_xyz); } //Ebene1.h #include "../structs.h" //main.cpp #include "../structs.h" void setLabels(); while(!quit) { setLabels(); }Ich hoffe, man kann da noch halbwegs durchblicken. Ich denke es ist aufs Wesentliche gekürzt und hoffe, dass es nicht zu viel gekürzt ist. Es kann sein, dass das, was ich im Moment da stehen habe völliger Unsinn ist, bitte nicht hauen. Ich habe wie gesagt inzwischen einiges durchprobiert und es an dieser Stelle bleiben gelassen.
Fehlermeldung dabei:
Fehler 556 error LNK2001: Nicht aufgelöstes externes Symbol ""struct ABC s_xyz" (?s_xyz@@3UABC@@A)". D:.....\Ebene2.obj
Fehler 557 error LNK1120: 1 nicht aufgelöste externe Verweise. D:.....\xxx.exeSoviel dazu. Sorry, wenns bissl arg unübersichtlich ist, habe mich nicht anders auszudrücken gewusst. Danke für jede Hilfe vorab

Grüße,
Joe#EDIT
Achso, bevor ichs vergesse:
Alle Header sind mit Includeguards in folgender Form ausgestattet:#pragma once #ifndef XXX_H_ #define XXX_H_ //... #endif
-
Hä?
Schreib einfach eine structs.h mit allen Structs drinne:
struct A { }; struct B { }; // ... extern A a_global; // deine globalen Variablen deklariert extern B b_global; //... void setLabels();In die structs.cpp schreibst du die Definitionen
#include "structs.h" A a_global; // das "struct" muss nicht hier hin, wir sind nicht in C B b_global; // ... void setLabels() { ABC s_xyz; s_xyz.fail = true; }Und die structs.h musst du überall wo da, wo du was von der Datei benutzen willst, einbinden (includieren).
-
Vielleicht der bessere Tipp: Denk nochmal über dein Design nach. Eine globale Variable die in 3 separaten Übersetzungseinheiten eingebunden wird? Das ist ein Fehler, der nur darauf wartet, zu passieren.
(Es kann natürlich sein, dass du einen guten Grund hast. Falls das zum Beispiel zur Datenübertragung zwischen OpenGL-Callbacks gedacht ist (das "draw" (wirklich mit new? Ganz sicher?) hat mich auf diese Idee gebracht), dann kannst du diesen Tipp ignorieren. Andererseits sollte man mit Grafikprogrammierung wohl lieber erst anfangen, wenn man structs schon lange gemeistert hat
)
-
Du brauchst nur die Typdefinition global in deiner struct.h und nicht auch noch die Variablen selbst.
Die übergibst du ausschließlich als Parameter, du brauchst also nirgendwo ein "extern".