'Staff': 'struct' Typneudefinition ---> bin ich blind?



  • Hallo,
    ich bekomme eine sehr komische Errormeldung:

    'Staff': 'struct' Typneudefinition
    

    Hier 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 bekannt

    Mach 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.


Anmelden zum Antworten