gegenseitiges includieren



  • // Player.h
    #pragma once
    
    class Map; // Forward Declaration
    
    class Player
    {
    public:
      void foo(Map & m);
    };
    
    // Player.cpp
    #include "Player.h"
    #include "Map.h"
    
    void Player::foo(Map & m)
    {
      m.bar(*this);
    }
    
    //Map.h
    #pragma once
    
    class Player; // Forward Declaration
    
    class Map
    {
    public:
      void bar(Player & p);
    };
    
    //Map.cpp
    #include "Map.h"
    #include "Player.h"
    
    void Map::bar(Player & p)
    {
      p.foo(*this);
    }
    


  • Map.h:

    class Player;
    
    class Map
    {
    };
    

    Player.h:

    class Map;
    
    class Player
    {
    };
    


  • ich schreibe meine funktionen ganz normal in die class und kann sie ganz normal definieren und nutzen oder?



  • Hä?
    Ich versteh die Frage nicht. Es sei denn ich missverstehe das Offensichtliche.

    Was ist an meinem Beispiel nicht zu verstehen?



  • wo baue ich die funktion der player class "moveplayer(char Direction, Player playernumber, Map mapnumber)" und die der class Map ein?

    map- und playernumber sind arrays.



  • Sorry, aber so ungenau wie du Fragen stellst und deinen Quellcode beschreibst, fällt mir grad nur das hier ein: Link



  • Du baust die Funktion nicht ein, sondern du übergibst eine Referenz dem Konstruktor. Dann kannst du die Funktionen in deiner Klasse aufrufen.



  • Wieso brauchen Player und Map dieselbe Methode?



  • nein nicht die selbe. dass sieht so aus :

    #ifndef MAP_H
    #define MAP_H
    #include <iostream>
    #include "player.h"
    using namespace std;
    
    class Map
    {
    public  :
    	Map();
        void createBlock(Map mapnum);
    	void deleteBlock(Map mapnum, Player playernumber);
    	void clearMap(Map mapnum,int mapwidth , int mapheight);
    
    	int  MapWidth;
    	int  MapHeight;
    
    	struct S_Map
    	{
    		bool InUse;
    		int  ID;
    	};
    
    	S_Map Map1[79][23];
    };
    
    #ifndef PLAYER_H
    #define PLAYER_H
    #include <iostream>
    #include "map.h"
    using namespace std;
    
    class Player
    {
    public  :
    	Player();
    	void DevideBonus(Player playernumber);
    	void NamePlayer(Player playernumber);
    	void HealPlayer(Player playernumber);
    	void KillPlayer(Player playernumber);
    	void PlayerMove(Player playernumber, char direction[20], Map mapnum);
    	void LevelUp(Player playernumber);
    	void GiveXP(Player playernumber);
    	int  DestPoints;
    	int  X_player;
    	int  Y_player;
    private :
    	int  LivePoints;
    	int  XPPoints;
    	int  BonusPlayer;
    	int  Level;
    	char PLayerName[20];
    	bool GhostMode;
    };
    
    #endif;
    


  • Lies bitte erstmal ein gutes Grundlagenbuch.

    1. Übergabe von Objekttypen sollte als "const Reference" geschenen
    2. Wieso übergibst du Methoden der Klasse "Map" eine "Map"? (Analog "Player")
    3. In deiner map.h fehlt das #endif
    4. Wieso ist "PlayerName" kein std::string?
    5. "char direction[20]" - wenn die Anzahl der möglichen Richtungen fest vorgegeben ist, sollte das besser ein enum sein
    6. Warum übergibst du Map::clearMap die Breite und Höhe?



  • 7. Wieso ist Map1 in der Map-Klasse kein vector<vector<S_Map>>?
    8. Wieso ist in der Map-Klasse nichts privat gekapselt?



  • meine frage ist aber wie ich dass beides includieren kan nicht wass ich für fehler mache



  • und dass #endif hab ich nur nicht mit rauskopiert



  • WhileTrueDo schrieb:

    meine frage ist aber wie ich dass beides includieren kan nicht wass ich für fehler mache

    das haben wir dir ja nun oft genug erklärt. Wenn du Parameterübergaben nicht als call-by-value machst, sondern als call-by-reference, benötigst du das include nicht, sondern kannst auf forward declarations zurückgreifen.

    Das war jetzt meine letzte hilfreiche Antwort. Solange ich nicht das Gefühl habe, dass du auch nur ansatzweise versuchst, unsere Antworten nachzuvollziehen oder gar Eigeninitiative zu zeigen, werde ich hier nichts mehr schreiben.

    Und ich hoffe, auch sonst keiner.



  • ich bin ein richtiger anfänger ich würde dass ja gerne nachvollziehn geht aber nunmal nicht deswegen fragte ich auch nach einer vollständigen lösung und nicht nach der methode es wäre in meinem interesse eine lösung zu kriegen die ich danach aus dem code heraus verstehen kann



  • #include ist, wei schon gesagt reine Textersetzung.
    Anstelle des #include "player.h" kommt der Inhalt der Datei player.h, dort ist ein #includ "map.h", das heißt der Inhalt von map.h kommt an diese Stelle, dort steht aber ein #include "player.h", das heißt der Inhalt der Datei player.h kommt an diese Stelle, dort steht aber ein #include "map.h",....
    Die Lösung sind Forward Deklarationen, lese darüber in deinem Grundlagenbuch nach.
    "If your favorite introductory C++ textbook doesn't discuss [forward declarations], carefully tear out all its pages and recycle them. Dispose of the book's cover in an environmentally
    sound manner, then borrow or buy a better textbook."



  • könntest du basierend auf der player.h und der map.h die bereits herausgegeben habe eine solche forward deklaration durchführen ?



  • WhileTrueDo schrieb:

    könntest du basierend auf der player.h und der map.h die bereits herausgegeben habe eine solche forward deklaration durchführen ?

    das hat Skym0sh0 schon auf der ersten Seite getan.



  • WhileTrueDo schrieb:

    könntest du basierend auf der player.h und der map.h die bereits herausgegeben habe eine solche forward deklaration durchführen ?

    Wenn du lesen würdest und mit einer priese google und einem Buch vielleicht einfach mal versuchst zu lernen anstatt nach komplett Lösungen zu heulen hättest du das schon seit gestern längst gelöst.



  • daddy_felix schrieb:

    WhileTrueDo schrieb:

    könntest du basierend auf der player.h und der map.h die bereits herausgegeben habe eine solche forward deklaration durchführen ?

    das hat Skym0sh0 schon auf der ersten Seite getan.

    Danke, ich dachte meine Posts sind unsichtbar.


Anmelden zum Antworten