Zum Inhalt springen

Problem beim erstellen einer Klassen auf dem Heap?!!!


CyberBob91

Empfohlene Beiträge

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!

Link zu diesem Kommentar
Auf anderen Seiten teilen

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();

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ;)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...