'Staff': 'struct' Typneudefinition ---> bin ich blind?
-
Hallo,
ich bekomme eine sehr komische Errormeldung:'Staff': 'struct' TypneudefinitionHier mein ganz einfacher Code (Staff.h):
#include <windows.h> #include <stack> struct Staff { Staff(POINT position); POINT pos; std::stack<int> *my_staff; };Es ist nirgends in meinem Projekt Staff deklariert, außer hier. Wenn ich Staff in Rumpelstielzchen verändere, dann funktioniert es trotzdem nicht und es kommt eine Fehlermeldung mit Rumpelstielchen

Sagt mal... bin ich blind oder warum sehe ich den Fehler nicht?
Hoffe ihr könnt mir helfen
Gruß Speedy_92
-
Wie benutzt Du das struct?
Wo ist die Konstruktor Impl.?
Gruss Simon
-
Die Konstruktor Implementierung ist in
Staff.cpp:#include "Staff.h" Staff::Staff(POINT position) : pos(position) {}Move.h:
#include "Staff.h" void Move(int count, Staff a, Staff b, Staff c);Move.cpp:
#include "Move.h" //funktion bewege (Zahl i, Stab a, Stab b, Stab c) { // falls (i > 0) { // bewege(i-1, a, c, b); // verschiebe oberste Scheibe von a nach c; // bewege(i-1, b, a, c); // } //} void Move(int count, Staff a, Staff b, Staff c) { if(count > 0) { Move(count - 1, a, c, b); c.my_staff->push(a.my_staff->top()); a.my_staff->pop(); Move(count - 1, b, a, c); } }Mein Ziel ist es die Türme von Hanoi darzustellen.
-
Klingt für micht nach "include-Recursion".
z.B. wenn Du in der main.cpp Staff UND Move.h inkludierst:main
-> staff.h
-> move.h -> staff.h // Boom !! hier ist "Staff" schon bekanntMach doch mal "include guards"
...
#ifndef STAFF_H #define STAFF_H // .. hier der Rest von Staff.h #endif // STAFF_H.. könnte allerdings sein, dass Du eine "echte" Rekursion hast. Dann bekommst Du später eine "unbekannter Typ"-Meldung, die Du dann mittels "forward declaration" in den Griff bekommen kannst.
Gruß,
Simon2.
-
Vielen Dank

Genau das wars
-
Hi,
gern geschehen.

Noch 2 Nachträge:
1.)Speedy_92 schrieb:
...
... struct Staff { ... std::stack<int> *my_staff; };Falls Du hier vorhast, das stack-Objekt auf den Heap zu legen (also mit new) => unnötig, aufwendig und fehleranfällig => nicht tun.
Das hier tut's besser:... struct Staff { ... std::stack<int> my_staff; };(Falls Du Dir Sorgen um die Größe machst: trotz des Namens ist es sehr wahrscheinlich, dass std::stack seine Daten intern sowieso auf den Heap legt)
2.)
Speedy_92 schrieb:
...
...void Move(int count, Staff a, Staff b, Staff c);Ich würde hier nicht 3 Staff-Objekte jedesmal kopieren. Referenzen helfen....
Entweder willst Du wirklich die übergebenen Objekte nicht verändern, dann kannst Du besser const-Referenzen nehmen:void Move(int count, Staff const& a, Staff const& b, Staff const& c);... oder Dir ist da sowieso ein Fehler unterlaufen und Du willst eigentlich die Staff-Objekte auch verändern in Move(). Dann MUSST Du sogar Referenzen (oder Zeiger) verwenden:
void Move(int count, Staff& a, Staff& b, Staff& c);In beiden Fällen braucht's übrigens IIRC gar nicht das "#include "Staff.h"", sondern eine forward-declaration reicht:
struct Staff; void Move(int count, Staff& a, Staff& b, Staff& c);Gruß,
Simon2.
-
Dankeschön. Werde meinen Code überarbeiten.