C++ Pointer auf Klassenmember setzen

TuxuT

Ensign
Registriert
Sep. 2011
Beiträge
251
Hallo Gemeinde,

ich komme irgendwie nicht weiter.
Ich habe eine Klasse cCircle mit einem Struct sPoint.
Diese Klasse soll eine public-Methode mGetMyPoint() bekommen, die einen Pointer aufnimmt und den Pointer auf sPoint "umbiegt", so dass der Aufrufer der public-Methode an die Struct Elemente kommen kann.
Ich weiß nur nicht wie?

So funktioniert es jedenfalls nicht:

C++:
class cCircle
{
public:
    struct sPoint
    {
        uint32_t posX;
        uint32_t posY;
    };

    cCircle()
    {
        myPoint.posX = 10;
        myPoint.posY = 20;
    }
    ~cCircle(){};

    void mGetMyPoint(sPoint* Point)
    {
        Point = &this->myPoint;
    }

private:
    sPoint myPoint;
};


int main(int argc, char *argv[])
{
    cCircle::sPoint* pPoint = NULL;

    cCircle myCircle;

    myCircle.mGetMyPoint(pPoint);

    return 0;
}
 
Du musst schon einen Pointer/Referenz auf den pointer als Argument übergeben lassen.
So änderst du nur die lokale Kopie des pointers, aber nicht den Pointer selbst.

PS: Statt einen pointer zu modifizieren: gib doch einfach eine Referenz deines Points zurück.
Z.b. so:


C++:
class cCircle
{
public:
    struct sPoint
    {
        uint32_t posX;
        uint32_t posY;
    };

    cCircle()
    {
        myPoint.posX = 10;
        myPoint.posY = 20;
    }
    ~cCircle(){};

    sPoint& mGetMyPoint()
    {
        return this->myPoint;
    }

private:
    sPoint myPoint;
};


int main(int argc, char *argv[])
{
   
    cCircle myCircle;

    auto& pPoint = myCircle.mGetMyPoint();

    return 0;
}
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Revan1710
Danke und wie sieht das dann aus?

myCircle.mGetMyPoint(&pPoint);

Hat jedenfalls nicht funktioniert.
 
Du musst bedenken, dass das Argument deiner Funktion quasi eine Kopie des Pointer-Wertes ist. Willst du also den Pointer umbiegen, müsstest du also die Adresse des Pointer übergeben und diesen dereferenzieren:

Code:
void mGetMyPoint(sPoint** Point)
{
    *Point = &this->myPoint;
}

Generell halte ich diese Vorgehensweise aber für schlechten Stil. Im Prinzip möchtest du doch nur die Adresse deines sPoint Members.

Wieso also nicht:

Code:
sPoint* mGetMyPoint(void)
{
    return &myPoint;
}
 
  • Gefällt mir
Reaktionen: herliTz_234, hroessler, new Account() und eine weitere Person
Allerbesten Dank! Auf diese Pointer-auf-Pointer-Geschichte wäre ich niemals gekommen...
 
Nicht vergessen das du den Pointer dann auch wieder aufräumen musst sonst hast du ein Speicherloch und wenn du mit neuen Sprachfeatures arbeiten darfst würde ich dir Smartpointer empfehlen.
 
Nicht der Fall hier: Sämtliche Pointer sind non-owning.

So würde man dann eher observer_ptr, reference_wrapper oder weak_ptr einsetzen - oder einfach * lassen (diskutabel).
 
Zuletzt bearbeitet:
Bei der Objektorientierten Softwareentwicklung geht es im Kern um Verteilung der Verantwortlichkeiten und Kapselung von Daten und Funktionen. Abgesehen davon ist es bei C++ Konvention: Referenzen vor Pointer. Allgemein sollten Pointer nur als letzte aller Möglichkeiten in Betracht gezogen werden. Darum ist die sauberste Lösung diese:
C++:
public Point& GetPoint() {
   return myPoint;
}

...
circle.GetPoint().posX;
..

Ohne kryptische Pointersyntax, alles schön zu lesen. Keine Memoryleaks.
 
Zuletzt bearbeitet:
Zurück
Oben