Funktionen verschachteln



  • Kleiner Exkurs:

    In Java versucht man Objekte immutable zu halten, d.h. wenn sie einmal initialisiert sind, können sie sich nicht mehr ändern.

    Da wird dann aus z.B. eienr solchen add Methode nicht eine Referenz auf this zurückgegeben, sondern ein neues Objekt:

    class Foo
    {
    public:
        Foo add(Foo const& other)
        {
            Foo f(this->a + other.a);
            return f;
        }
    };
    


  • Danke für die schnelle Antwort. Allerdings habe ich noch nicht ganz verstanden wie du das umsetzen würdest. Habe ich es richtig verstanden, dass dafür Zeiger notwendig sind? Sorry, Zeiger sind nicht wirklich meine Spezialität, daher hat es bei mir noch nicht ganz klick gemacht.



  • Ja dazu gibst du einen Zeiger (den this-zeiger) zurück. Wenn dir diese Funktion so wichtig ist, mach einfach copy paste.

    Ps: bei Java wird nicht benötigte Speicher automatisch frei gegeben, das hast du bei c++ soweit ich weiß nicht, Also kannst du nicht mal eben ein neues Objekt zurück geben



  • HansKlaus schrieb:

    soweit ich weiß

    Und warum informierst du dich nicht erst, bevor du hier so viele Antworten gibst?


  • Mod

    Mechanics schrieb:

    HansKlaus schrieb:

    soweit ich weiß

    Und warum informierst du dich nicht erst, bevor du hier so viele Antworten gibst?

    Und das mit dem Zeiger war auch falsch. Ich habe doch schon selber geschrieben:

    SeppJ schrieb:

    Das geht, indem du add() eine Referenz auf das aktuelle Objekt (aus Sicht von add also *this ) zurück geben lässt.

    Also nix vonwegen Rückgabe eines Zeigers.



  • Wieso? add() gibt in dem von dir geschriebenen Code *this zurück? Ich habe mal gelernt, dass Variablen mit * Zeiger sind, Also ist *this doch ein Zeiger, der zurück gegeben wird. 😕



  • Ich steh grad ziemlich auf dem Schlauch. Vielleicht poste ich mal den gesamten Code. Ich weis grad nicht wirklich was ich falsch mache. Vielleicht hättet ihr noch einen Tip für mich.

    #include <iostream>
    
    using namespace std;
    
    class rechne
    {
    	private: 
    		double num1, num2, sum;
    	public:
    		rechne(float r, float i);
    		double zahl1(), zahl2();
    		double add(rechne a);
    		void print();
    };
    
    rechne::rechne(float r, float i) { num1 = r; num2 = i;}
    
    double rechne::zahl1() {return num1;}
    double rechne::zahl2() {return num2;}
    
    double rechne::add(rechne a)
    {
    	sum=a.zahl1() + a.zahl2();
    	double *zeigerSum = &sum;
    	cout << *zeigerSum << endl;
    	return *zeigerSum;
    }
    
    void rechne::print() {cout << "Summe= " << sum << "\n";}
    
    int main()
    {
    	rechne X(0,0), Y(5,2);
    	X.add(Y);
    	X.print();
    	X.add(Y).print();
    	system("pause");
    	return 0;
    }
    

    Derzeit bekomme ich bei der Zeile X.add(Y).print(); folgenden Fehler: [Error] request for member 'print' in 'X.rechne::add(Y)', which is of non-class type 'double'

    Vielen Dank nochmal.



  • HansKlaus schrieb:

    Wieso? add() gibt in dem von dir geschriebenen Code *this zurück? Ich habe mal gelernt, dass Variablen mit * Zeiger sind, Also ist *this doch ein Zeiger, der zurück gegeben wird. 😕

    Kommt drauf an, wo * steht... 😉

    In diesem Kontext ist es eine Dereferenzierung des this -Zeigers, das Ergebnis ist aber eine Referenz und die wird zurückgegeben.

    Auch & bedeutet nicht immer Referenz...



  • dagmuc schrieb:

    Ich steh grad ziemlich auf dem Schlauch. ...

    Muss sein:

    rechne& rechne::add(rechne a) 
    { 
        sum=a.zahl1() + a.zahl2(); 
        cout << sum << endl; 
        return *this; 
    }
    


  • HansKlaus schrieb:

    Ps: bei Java wird nicht benötigte Speicher automatisch frei gegeben, das hast du bei c++ soweit ich weiß nicht, Also kannst du nicht mal eben ein neues Objekt zurück geben

    Nur mit new (und new[] ) erzeugte Objekte (Heap) werden nicht automatisch freigegeben - automatische Objekte (Stack) allerdings schon, deshalb heissen sie so. 😉

    Man kann also sehr wohl mal eben ein neues Objekt zurückgeben.


Anmelden zum Antworten