Übergameparameter will nicht



  • Obwohl ich meine Klasse inkludiere, heißt es:

    d:\c++\test2\items.h(14) : error C2061: Syntaxfehler : Bezeichner 'PLAYER'
    d:\c++\test2\items.h(22) : error C2061: Syntaxfehler : Bezeichner 'PLAYER'

    Der Code:

    player.h

    #ifndef _PLAYER_H_
    #define _PLAYER_H_
    
    //***INCLUDES***//
    #include "items.h"
    
    //***CLASS PLAYER***//
    class PLAYER
    {
    public:
    	signed health;
    };
    
    #endif
    

    items.h

    #ifndef _ITEMS_H_
    #define _ITEMS_H_
    
    //***INCLUDES***//
    #include "player.h"
    
    //***CLASS ITEM***//
    class Item 
    { 
    public:
    	virtual void use(PLAYER &player) = 0; 
    }; 
    
    //***ITEM CLASSES***//
    class Healthpotion : public Item 
    { 
    public: 
        virtual void use(PLAYER &player) 
        {
    		player.health += 100;
        } 
    }; 
    
    #endif
    


  • Du bindest die beiden Header-Dateien gegenseitig ein. Das hat zur Folge, dass in der player.h die items.h geöffnet wird und im Code die Klasse PLAYER (ich hoffe die Großschreibung ist nur zur Hervorhebung gedacht) noch nicht bekannt ist.

    Du kannst das mittels einer Forward-Deklaration lösen:

    // in items.h
    #include "player.h"
    
    class PLAYER;
    
    class Item
    {
    ...
    

    MfG SideWinder



  • Funktioniert nicht:

    d:\c++\test2\items.h(24) : error C2027: Verwendung des undefinierten Typs "PLAYER"
    d:\c++\test2\items.h(7) : Siehe Deklaration von 'PLAYER'
    d:\c++\test2\items.h(24) : error C2228: Der linke Teil von '.health' muss eine Klasse/Struktur/Union sein



  • du kannst use() nicht inline declarieren.
    implementiere use(...) in einer separaten .cc Datei
    Kurt



  • Kannst du mir vielleicht einen Beispielcode schreiben?
    Bei mir funktioniert das immer noch nicht ..

    D:\C++\Test2\items.cpp(5) : error C2511: 'use' : Überladene Member-Funktion 'void (class PLAYER &)' nicht in 'Item' gefunden
    d:\c++\test2\items.h(13) : Siehe Deklaration von 'Item'
    Fehler beim Ausführen von cl.exe.



  • Im player.h brauchst Du item.h nicht. Laß es einfach weg, dann funktioniert das.

    Tommi



  • //player.h
    
    #ifndef _PLAYER_H_
    #define _PLAYER_H_
    
    //***INCLUDES***//
    
    #include "items.h"
    
    //***CLASS PLAYER***//
    class PLAYER {
    public:
        signed health;
    };
    
    #endif
    
    //items.h
    
    #ifndef _ITEMS_H_
    #define _ITEMS_H_
    
    //***INCLUDES***//
    #include "player.h"
    
    class PLAYER;  // wirkt zwar irgendwie pervers
                   // da player.h schon #included
                   // aber PLAYER ist hier noch nicht definiert 
                   // da player.h sofort wieder dieses file #includiert
    
    //***CLASS ITEM***//
    class Item {
       public:
        virtual void use(PLAYER &player) = 0;
    };
    
    //***ITEM CLASSES***//
    class Healthpotion : public Item {
       public:
        virtual void use(PLAYER &player);  // hier nur declaration
    };
    
    #endif
    
    // items.cc
    void Healthpotion::use(PLAYER &player) { 
            player.health += 100;
    }
    

    Wie tntnet schon gesagt hat brauchst in diesem Fall das #include "items.h" in player.h gar nicht ( kann aber noch kommen ).
    Ich würde in so einem Fall wenn 2 Klassen voneinander abhängig sind die gegenseitigen #include's überhaupt weglassen und nur mit forward declarations arbeiten. Der Nachteil ist dann aber natürlich dass du memberfunktionen die die andere Klasse verwenden nicht mehr inline declarieren kannst.

    Kurt



  • Bei deinem Code:

    D:\C++\Test2\items.cpp(2) : error C2653: 'Healthpotion' : Keine Klasse oder Namespace
    D:\C++\Test2\items.cpp(2) : error C2065: 'PLAYER' : nichtdeklarierter Bezeichner
    D:\C++\Test2\items.cpp(2) : error C2065: 'player' : nichtdeklarierter Bezeichner
    D:\C++\Test2\items.cpp(2) : error C2448: '<unbekannt>' : Funktionsstil-Initialisierung scheint eine Funktionsdefinition zu sein
    main.cpp
    Fehler beim Ausführen von cl.exe.



  • hast nen header vergessen sorry


Anmelden zum Antworten