Funktionen verschachteln



  • Hallo zusammen,

    ich habe vor kurzem mit dem Thema C++ angefangen und hätte eine Frage, bei der ihr mir vieleicht helfen könntet.

    Ich habe eine Klasse (rechne) in der einige Werte und Funktionen definiert sind. Die Hauptfunktion (main) erstellt die Instanzen X und Y und weist jeweils zwei Integer Werte zu. Die Methode add addiert die Werte 5 und 2 von B und speichert sie in A ab. Die Methode print gibt dann lediglich das Ergebnis aus. Das funktioniert soweit auch problemlos.

    Hier der Teil:

    int main()
    {
    	rechne A(0,0), B(5,2);
    	A.add(B);
    	A.print();
    }
    

    Meine Frage wäre nun, was ich machen muss um anstatt A.add(B); A.print(); auch A.add(B).print(); schreiben zu können. Habe ich die Möglichkeit den Wert, den A.add(B); ergibt, gleich an die nächste Methode zu übergeben?

    Vielen Dank.

    Viele Grüße
    dag


  • Mod

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

    class Foo
    {
      Foo& add()
      {
         // ...
         return *this;
      }
      void print();
    };
    
    // ...
    
    Foo A;
    A.add().print();
    


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


Log in to reply