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])->iCounter

    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.



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

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

    jedoch 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


Anmelden zum Antworten