Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

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

Empfohlene Antworten

Veröffentlicht

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!

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

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

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

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

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.