Zugriff auf Array aus Klassenpointern
-
Ich lerne immer noch C++ und bin mal wieder auf eine Unklarheit gestoßen. Hier der Code:
#include <iostream> using namespace std; class CAusnahme1{ public: static int iCounter; CAusnahme1() { iCounter ++; cout << "Erstelle Klasse Ausnahme1!" << endl; } ~CAusnahme1() { cout << "Zerstöre Klasse Ausnahme1!" << endl; } }; int CAusnahme1::iCounter = 0; class CAusnahme2{}; class CAusnahme3{}; class CAusnahmeX{}; int main() { CAusnahme1* pC1[3]; // Array aus CAusnahme1-Pointern CAusnahme1 pC2[] = {CAusnahme1(), CAusnahme1(), CAusnahme1()}; // Array aus CAusnahme1-Variablen for (int i = 0; i < 3; i++) { pC1[i] = &pC2[i]; } for (int i = 0; i < 3; i++) { cout << pC1[i] << endl; cout << &pC2[i] << endl; cout << pC1[i]->iCounter << endl; } return 0; }Ausgabe:
0xbf87bdad 0xbf87bdad 3 0xbf87bdae 0xbf87bdae 3 0xbf87bdaf 0xbf87bdaf 3 Zerstöre Klasse Ausnahme1! Zerstöre Klasse Ausnahme1! Zerstöre Klasse Ausnahme1!Jetzt meine Frage:
Warum funktioniert:cout << pC1[i]->iCounter << endl;???
Warum muss beim Zugriff auf pC1[0]->iCounter z.B. nicht der Indirektionsoperator verwendet werden, etwas so:
*(pC1[0])->iCounterIn pC1[0] ist doch ein Pointer auf ein Objekt der Klasse CAusnahme1... Da müsste ich doch normalerweise dereferenzieren, um auf den Inhalt zuzugreifen.
-
acelab schrieb:
In pC1[0] ist doch ein Pointer auf ein Objekt der Klasse CAusnahme1... Da müsste ich doch normalerweise dereferenzieren, um auf den Inhalt zuzugreifen.
Der .-Operator greift auf den Inhalt zu. Der ->-Operator dereferenziert und greift dann auf den Inhalt zu.
Beispiel:
struct Foo { int Bar; }; Foo* Baz = new Foo; Baz->Bar = 5; (*Baz).Bar = 5; delete Baz;
-
Wie schon erklärt wurde dereferenziert der ->Operator den Pointer und greift dann auf deine Variable zu. Ein Äquivalenter Code wäre
(*ptr).myVariablejedoch benutzt man in C++ überlicherweise den ->Operator, da er ja genau das macht und übersichtlicher ist.
Lg freeG
-
fr33g schrieb:
Wie schon erklärt wurde dereferenziert der ->Operator den Pointer und greift dann auf deine Variable zu. Ein Äquivalenter Code wäre
(*ptr).myVariablejedoch benutzt man in C++ überlicherweise den ->Operator, da er ja genau das macht und übersichtlicher ist.
Lg freeG
Dann funktioniert in meinem Fall:
cout << (*pC1[i]).iCounter << endl;, wie ich soeben gelernt habe.
Und schon wieder ist ein Licht aufgegangen. Danke an Alle.
-
Ja genau, wobei ich auch eher zum Pfeiloperator tendieren würde.
Lg freeG