C++ Pointer auf Klassenmember setzen

TuxuT

Ensign
Dabei seit
Sep. 2011
Beiträge
235
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;
}
 

new Account()

Rear Admiral
Dabei seit
Mai 2018
Beiträge
5.751
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:

TuxuT

Ensign
Ersteller dieses Themas
Dabei seit
Sep. 2011
Beiträge
235
Danke und wie sieht das dann aus?

myCircle.mGetMyPoint(&pPoint);

Hat jedenfalls nicht funktioniert.
 

Revan1710

Lt. Commander
Dabei seit
März 2012
Beiträge
1.567
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;
}
 

Ebrithil

Lieutenant
Dabei seit
Dez. 2014
Beiträge
564

TuxuT

Ensign
Ersteller dieses Themas
Dabei seit
Sep. 2011
Beiträge
235
Allerbesten Dank! Auf diese Pointer-auf-Pointer-Geschichte wäre ich niemals gekommen...
 

herliTz_234

Lieutenant
Dabei seit
Aug. 2007
Beiträge
775
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.
 

new Account()

Rear Admiral
Dabei seit
Mai 2018
Beiträge
5.751
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:

LencoX2

Lt. Junior Grade
Dabei seit
Feb. 2006
Beiträge
481
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:
Top