Zeiger auf Klassenkomponente



  • Hallo,
    -> ich möchte in einer void Fkt. einen Zeiger auf eine Klassenkomponente der Klasse K des Typs float übergeben um den Wert zu ändern. <-

    Genauer:

    Ich habe also eine Klasse K:

    class K {public: float x=0;}

    ,nun möchte ich eine Fkt:

    void k_aendern( "Zeiger auf x innerhalb von k (*1)" )
    {
    "aendere den Wert von x innerhalb von K auf z.B.: 5.5 (*2)"
    }

    und
    in der int main()
    {
    K k; // Objekt k vom Typ K
    x_in_k_aendern("Zeiger auf x von k (*3)");
    }

    Ich habe mit der mir vorliegenden Literatur einige Versuche gestartet (wie für (*3) k_aendern(&k::x) und sowas), ohne Erfolg, und wüsste jetzt gerne, was ich für (*1) (*2) und (*3) setzen muss, damit das funktioniert.
    Ich kann in der k_aendern Fkt. ja nicht einfach k.x=5.5 setzen, da der Fkt. k unbekannt ist.
    Ich glaube das ganze ist sehr Standardmäßig, nur ich verpeil wohl die Syntax. Weiss einer Rat oder Alternativen (am besten ohne weitere variablen einzuführen) ??? 💡



  • CtheR schrieb:

    Ich kann in der k_aendern Fkt. ja nicht einfach k.x=5.5 setzen, da der Fkt. k unbekannt ist.

    Wie wärs dann, der Funktion k bekannt zu machen?



  • Klingt sinnvoll und einfach,
    wie mache ich das denn ?



  • Meinst du einfach so?

    class K
    {
    public:
    	K()
    		:	x(0)
    	{
    	}
    
    	float x;
    };
    
    void changeSomething(float* v)
    {
    	*v = 123.456f;
    }
    
    int main(int argc, char** argv)
    {
    	K k;
    	changeSomething(&(k.x));
    	return 0;
    }
    

    Oder willst du was anderes? Wenn du was anderes willst hab ichs auf jeden Fall nicht verstanden was du willst 🙂
    So kannst du halt an "changeSomething" einen Pointer auf irgendein float übergeben - egal ob das jetzt ein Member von einem K ist oder ganz woanders lebt. Wenn du willst dass man nur einen Zeiger auf ein float innerhalb von einem K übergeben kann dann musst du nen member-pointer + instance-pointer an "changeSomething" übergeben.



  • p.S.: ich tendiere dazu Fragen wörtlich zu nehmen, auch wenn vielleicht eine andere/einfachere Lösung besser wäre. Natürlich kannst du anstelle von einem Zeiger auf float auch einen Zeiger auf K übergeben, wenn die Funktion die in K was ändern will selbst weiss WAS (also welches float z.B.) sie da drinnen ändern will.

    // declare K ...
    void changeK(K* k)
    {
        if(k)
            k->x = 42;
    }
    
    void foo()
    {
        K k;
        changeK(&k);
    }
    


  • Sorry, das ich gestern nicht mehr geantwortet habe, das Forum schien irgendwie down zu sein....
    Also ich habe das Problem anders gelöst (umständlicher), aber wie im Code angegeben (so hatte ichs auch versucht) hat es nicht funktioniert.
    Hab dazu im "RRZN C++ für C-Programmierer" gefunden:
    Zitat:
    "Eine Variable pf vom Typ Zeiger auf eine float-Komponente der Klasse complex (also son Im-Re-Bsp.)wird deklariert und initialisiert :
    float complex::pf = &complex::re;
    Der Daterntyp float complex::* ist sorgfältig zu unterscheiden vom Typ float*.. Ersterer repräsentiert die relative Stellung einer Float Komponente in der Klasse komplex, letzterer die Speicheradresse einer beliebigen float-Variablen."
    Zitat Ende.
    Verwirrte mich etwas, ist aber jetzt egal, werd bei Zeiten noch mal drüber nachdenken, bin aber ganz froh, dass es jetzt funzt.

    DANKE für eure Hilfe !!!
    Ich denke ich komme jetzt alleine klar.
    PS.: super Forum schnelle antworten, hier bleib ich!



  • Der grüne Smily war ursprünglich ein complex : : * pf ......


Anmelden zum Antworten