gegenseitiges includieren
-
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.
-
dass habe ich schon versucht und es wird auch gezeigt wie es geht, ich möchte es aber auch verstehen deswegen bin ich auf diesem forum, ich dachte hir bekomme ich hilfe in form von lösungen und antworten also ich bitte dich sehr dolle zeig mir die lösung
-
WhileTrueDo schrieb:
dass habe ich schon versucht und es wird auch gezeigt wie es geht, ich möchte es aber auch verstehen deswegen bin ich auf diesem forum, ich dachte hir bekomme ich hilfe in form von lösungen und antworten also ich bitte dich sehr dolle zeig mir die lösung
Du hast eine Lösung auf Seite 1 und du hast danach noch Erklärungen erhalten und du hast danach noch Hinweise erhalten, was man allgemein besser machen könnte. Was möchtest du mehr? Maoam? Satzzeichen?
-
ich möchte dass meine funktionen in dieses beispiel eingebaut werden und ich verstehe nicht wie ich die verbesserungen umsetzen soll
-
WhileTrueDo schrieb:
ich möchte dass meine funktionen in dieses beispiel eingebaut werden und ich verstehe nicht wie ich die verbesserungen umsetzen soll
Lesen und selber machen. Nicht machen lassen so verstehst du nichts.
-
Dann versuch doch als erstes, ein Objekt als "call-by-reference" an eine Funktion zu übergeben.
class Test { public: int a; } void ChangeMember(Test param) // dies ist "call-by-value". Bitte ersetzen durch "call-by-reference" { param.a = 20; } int main() { Test testObject: testObject.a = 10; cout << "testObject.a: " << testObject.a << "\n"; ChangeMember(testObject); cout << "testObject.a: " << testObject.a << "\n"; }
-
Haha^^ Doch
Es war einmal ein Programmierer, der hatte einen Auftrag. Da er faul war, wie alle Informatiker und Programmierer, dachte er sich in seinem Kopf: "Hach, da erleichtere wer die Arbeit mir in meinem Topf!" Zu jener Zeit war das Geschäftsmodell des Outsourcing sehr modern, so kam es, dass unser Programmierer in China angerufen und sich mehrere externe Programmierer angeheuert hat. Seine Aufgaben delegierte er von nun an brav weiter nach China und brauchte nie mehr einen Finger krumm machen.

Es wird weiterhin erzählt, dass dieser Programmierer so erfolgreich mit seinem Tun war, dass er sich noch weitere Jobs besorgte und diese auch nach China delegierte. Sein monatliches Einkommen wuchs und wuchs.
Der Böse Kaiser (sein Chef) bekam nur irgendwann mit, dass extrem viele Zugriffe aus China auf das Firmen VPN vollzogen wurden, bis er durch Nachforschungen bei unserem Freund landete. Aber anstatt ihn zu einem Abteilungsleiter oder einer anderen Führungsposition zu befördern, hat er ihn gefeuert.Und die Moral von der G'schicht: Lern richtig programmieren, dann kriegste auch kein Arschtritt!
Nachtrag: Wie wir alle wissen beginnen Märchen mit "Es war einmal...". Echtes Seemannsgarn fängt mit "Ey, jetzt mal ohne Scheiss..." an.
-
daddy_felix schrieb:
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.
daddy_felix schrieb:
Dann versuch doch als erstes, ein Objekt als "call-by-reference" an eine Funktion zu übergeben.
Ähh....
Es ist zwar nicht unbedingt bester Stil, komplexe Objekttypen als Kopie zu übergeben, aber für eine Funktionsdeklaration reicht auch ein "incomplete type" vollkommen aus. Ich habe den Eindruck, dass ist dir selber nicht klar:
class foo; class bar { void x(foo f); // Absolut ok }; void x(foo); // Natürlich auch void y(foo) { } // Geht nicht!Falls ich dir gerade unrecht tue und du das wusstest: Entschuldigung. Bei solch einem langen Thread ist schwer nachzuvollziehen, worauf alle Beteiligten überhaupt hinaus wollen.