CyberBob91 Geschrieben 30. Dezember 2007 Geschrieben 30. Dezember 2007 Hallo nochmal... ich habe nun ein anderes Problem: ich erstelle in einer Funktion Instanzen von bestimmten klassen auf dem Heap und versuche sowohl in der funktion als auch in der int main vergeblich auf diese instanzen zuzugreifen...(46Fehler xD) es ist mir bewusst, dass ich an manchen Stellen zwangsweise Fehler haben muss, weil ich den eigentlichen quellcode probeweise abgeändert habe, aber wie man das problem lösen kann weiss ich nicht... es wäre echt super wenn ihr mir helfen könntet hier mien code: #include <iostream> #include "karte.hpp" #include "einheit.hpp" using namespace std; int SpielfeldVorbereiten(); //HAUPTFUNKTION///////////////////////////////////// int main() { CKarte *pMap=NULL; CKing *pKing1=NULL; CKing *pKing2=NULL; CRanger *pRanger1=NULL; CRanger *pRanger2=NULL; SpielfeldVorbereiten(); //Erzeugt Instanzen für Spielfeld und Figuren auf dem Heap und setzt die Figuren *pMap.KarteZeichnen(); for (int i=0; i<20; i++) { pRanger1[1].Bewegen(*pMap); pMap.KarteZeichnen(); } pKing1.ZeigeStatus(); pRanger1[3].ZeigeStatus(); ///TEST////// //damit Prog nicht direkt schliesst int test; cin>>test; ///TEST//////// return 0; } int SpielfeldVorbereiten() { ////Das Spielfeld vorbereiten/////// //Instanz auf dem Heap erzeugen pMap = new CKarte; ///////////////////////////////////// //Instanten d. Figuren auf dem Heap erzeugen, initialisieren und die Figuren "aufs Spielfeld setzen" ////////Könige/////////// pKing1 = new CKing; //König Spieler 1 pKing2 = new CKing; //und 2 pKing1.Ini(1,5,9); pKing2.Ini(2,5,1); pKing1.Markieren(*pMap); pKing2.Markieren(*pMap); ///////////////////////// ////////Ranger////////// pRanger1 = new CRanger[3]; //ranger spieler1 pRanger2 = new CRanger[3]; //und spieler 2 pRanger1[1].Ini(1,4,9); pRanger1[2].Ini(1,6,9); pRanger1[3].Ini(1,4,7); //-- pRanger2[1].Ini(2,4,1); pRanger2[2].Ini(2,6,1); pRanger2[3].Ini(2,5,3); pRanger1[1]->Markieren(*pMap); pRanger1[2]->Markieren(*pMap); //pRanger1[3]->Markieren(*pMap); //-- pRanger2[1]->Markieren(*pMap); pRanger2[2]->Markieren(*pMap); pRanger2[3]->Markieren(*pMap); //////////////////////// cout<<endl; //////////////////////// return 0; } und hier die fehlermeldungen: D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(20) : error C2228: Der linke Teil von '.KarteZeichnen' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(25) : error C2228: Der linke Teil von '.KarteZeichnen' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(28) : error C2228: Der linke Teil von '.ZeigeStatus' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(43) : error C2065: 'pMap' : nichtdeklarierter Bezeichner D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(43) : error C2440: '=' : 'class CKarte *' kann nicht in 'int' konvertiert werden Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(50) : error C2065: 'pKing1' : nichtdeklarierter Bezeichner D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(50) : error C2440: '=' : 'class CKing *' kann nicht in 'int' konvertiert werden Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(51) : error C2065: 'pKing2' : nichtdeklarierter Bezeichner D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(51) : error C2440: '=' : 'class CKing *' kann nicht in 'int' konvertiert werden Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(53) : error C2228: Der linke Teil von '.Ini' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(54) : error C2228: Der linke Teil von '.Ini' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(56) : error C2228: Der linke Teil von '.Markieren' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(56) : error C2100: Zeigeroperation ungueltig D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(57) : error C2228: Der linke Teil von '.Markieren' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(57) : error C2100: Zeigeroperation ungueltig D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(61) : error C2065: 'pRanger1' : nichtdeklarierter Bezeichner D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(61) : error C2440: '=' : 'class CRanger *' kann nicht in 'int' konvertiert werden Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(62) : error C2065: 'pRanger2' : nichtdeklarierter Bezeichner D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(62) : error C2440: '=' : 'class CRanger *' kann nicht in 'int' konvertiert werden Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(64) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(64) : error C2228: Der linke Teil von '.Ini' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(65) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(65) : error C2228: Der linke Teil von '.Ini' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(66) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(66) : error C2228: Der linke Teil von '.Ini' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(68) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(68) : error C2228: Der linke Teil von '.Ini' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(69) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(69) : error C2228: Der linke Teil von '.Ini' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(70) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(70) : error C2228: Der linke Teil von '.Ini' muss eine Klasse/Struktur/Union sein D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(72) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(72) : error C2227: Der linke Teil von '->Markieren' muss auf Klasse/Struktur/Union zeigen D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(72) : error C2100: Zeigeroperation ungueltig D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(73) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(73) : error C2227: Der linke Teil von '->Markieren' muss auf Klasse/Struktur/Union zeigen D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(73) : error C2100: Zeigeroperation ungueltig D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(76) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(76) : error C2227: Der linke Teil von '->Markieren' muss auf Klasse/Struktur/Union zeigen D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(76) : error C2100: Zeigeroperation ungueltig D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(77) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(77) : error C2227: Der linke Teil von '->Markieren' muss auf Klasse/Struktur/Union zeigen D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(77) : error C2100: Zeigeroperation ungueltig D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(78) : error C2109: Index benoetigt ein Feld oder einen Zeigertyp D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(78) : error C2227: Der linke Teil von '->Markieren' muss auf Klasse/Struktur/Union zeigen D:\Programme\Microsoft Visual Studio\MyProjects\ProtectTheKingNeu\main.cpp(78) : error C2100: Zeigeroperation ungueltig Fehler beim Ausführen von cl.exe. ProtectTheKingNeu.exe - 46 Fehler, 0 Warnung(en) NOCHMAL THX IM VORRAUS ICH BIN ECHT AM VERZWEIFELN! Zitieren
carstenj Geschrieben 30. Dezember 2007 Geschrieben 30. Dezember 2007 Hi, ich frage mich immer, wie man über 80 Zeilen tippen kann, um dann beim Kompilieren 46 Fehlermeldungen zu erhalten? Ich würd einfach mal vor jedem pMap das Sternchen wegnehmen, außer natürlich vor der Definition. EDIT: Außerdem greift man auf eine Funktion eines Objekts auf dem Heap entweder mit -> zu pMap->KarteZeichnen(); oder so (*pMap).KarteZeichnen(); Zitieren
CyberBob91 Geschrieben 30. Dezember 2007 Autor Geschrieben 30. Dezember 2007 danke für die antwort... zu meiner verteidigung muss ich sagen, dass ich erst seit 2 tagen c++ lerne und deshalb einfach noch nicht so gefestigt in themen wie zeigern bin... und nein ich habe nicht von anfang an soviel getippt um dann 46 fehler zu bekommen... am anfang hatte ich einfach lokale instanzen in der int main definiert... das hat wunderbar funktioniert war aber unübersichtlich, deshalb habe ich einfach den ganzen code in eine extra funktion gepackt, die instanzen auf dem heap erzeugt und einige sachen an der synthax geändert... und ja ich weiss, dass man bei zeigern -> benutzen muss um eine funktion aufzurufen, wie du siehst habe ich das ja auch bei einigen so gemacht, ich war mir nur auf grund der ganzen fehler unsicher und habe ein paar stellen zum test ausgetauscht... Zitieren
CyberBob91 Geschrieben 30. Dezember 2007 Autor Geschrieben 30. Dezember 2007 ich habe nun überall wo mit einem zeiger auf eine memberfunktion zugegriffen wird, ein -> gesetzt... bei den pMap-Zeigern hat es auch fehler behoben + es erschien nach setzen des -> sofort ein dropdownmenü mit möglichen memberfunktionen und variablen, wie es ja schließlich auch sein sollte, aber alle zeiger die auf ein Array verweisen akzeptieren kein -> sondern das menü erscheint nur bei einem . . Ist das richtig so, bzw. warum ist das so? danke nochmal für dei schnelle antwort eben Zitieren
Klotzkopp Geschrieben 30. Dezember 2007 Geschrieben 30. Dezember 2007 Ist das richtig so, bzw. warum ist das so? Das ist richtig so. Wenn du einen Zeiger mit dem Arraysubskript-Operator verknüpfst, ist das Ergebnis kein Zeiger, sondern das Objekt an der betreffenden Stelle. Darum brauchst du für den Memberzugriff den Punkt, nicht den Pfeil. Die Zählung der Indizes beginnt übrigens bei 0, nicht bei 1. Bei einem CRanger[3] lauten die gültigen Indizes also 0, 1 und 2 (nicht 1, 2 und 3). Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.