Verständnisprobleme Operator/Kopierkonstruktor



  • Guten Abend die Herren/Damen 🙂 ,

    leider habe ich mit folgendem Programm so meine Schwierigkeiten.

    Die Aufgabe behandelt einen Klassen-/Funktionsaufbau zum berechnen eines Ortsvektors.

    Folgendes Programmskelett ist gegeben : (habe versucht möglichst mit kommentaren meine schwierigkeiten zu verdeutlichen)

    #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    class Punkt 
    {
    public :
    	Punkt (double,double,double);						// Konstruktor für x,y,z.
    	friend void anzeigen(ostream os, const Punkt&);		// Friendfunktion für x,y,z
    	double betrag();									// Länge des Ortsvektors (Betrag)
    	Punkt& Punkt::operator+=(const Punkt& b);			// Zuweisungsoperator
    // rückgabewert des operators ist das objekt dem etwas zugewiesen wird.
    // das ein neues objekt erzeugt wird reicht eine referenz als rückgabewert. b = referenz auf punkt
    private :
    	double x,y,z;										//Koordinaten
    };
    
    Punkt::Punkt(double xx,double yy,double zz): xx(0),yy(0),zz(0)
    {
    x=xx;
    y=yy;
    z=zz;
    }; // habe ich die Initialisierungsliste korrekt ausgeführt ?
    
    double Punkt::betrag() // zum berechnen von b=sqrt(x²+y²+z²)
    {
    	betrag=sqrt((xx*xx)+(yy*yy)+(zz*zz)); // möglich ???
    
    }
    
    Punkt& Punkt::operator+=(const Punkt& b)
    {
    	// wie verfahre ich mit dem operator ? , muss ich zusätzlich einen kopierkonstruktor aufrufen ? wenn ja , was übergebe ich und wie ?
    }
    
    void anzeigen( ???? ) // wie verwende ich die Friends funktion , inwiefern benötige ich sie ? wieso zugriff direkt auf x etc. und nicht auf alias ?
    {
    	return ????
    }
    
    int main()
    {
    	Punkt P1(3,4,0);			// Objekt P1 vom Typ Punkt mit eigenschaften
    	Punkt P2(0,0,3);			//  x=0, y=0 , z=3 ;
    	cout << P1.betrag() << endl; // Eigenschaft betrag von Punkt 1
    	anzeigen(cout, P1);
    	P1+=P2;
    	anzeigen(cout, P1);
    }
    

    Vielleicht habt ihr ja den ein oder anderen tip 🕶

    Danke

    Peter



  • double Punkt::betrag() // zum berechnen von b=sqrt(x²+y²+z²)
    {
        return sqrt((xx*xx)+(yy*yy)+(zz*zz)); // betrag wurde nie definiert, also würde Fehler bringen
    
    }
    
    Punkt& Punkt::operator+=(const Punkt& b)
    {
        // wie verfahre ich mit dem operator ? , muss ich zusätzlich e
    inen kopierkonstruktor aufrufen ? wenn ja , was übergebe ich und wie ?
        this.x = this.x + b.x;
        this.y = this.y + b.y;
        this.z = this.z + b.z;
    
        retun (*this);
    }
    

    sollte so in der art gehen, nur hab ich es net getestet



  • #include <iostream>
    #include <cmath>
    
    using namespace std;
    
    class Punkt 
    {
    public :
      Punkt (double xx, double yy, double zz);	
      //Punkt (double,double,double);
    
      friend void anzeigen(ostream os, const Punkt& p);
      //friend void anzeigen(ostream os, const Punkt&);
    
      double betrag();
    
      //das ist keine Zuweisung sondern Addieren und Punkt:: hat hier nichts zu suchen				
      Punkt& operator+=(const Punkt& b);
    
    private :
    	double x,y,z;
    };
    
    Punkt::Punkt(double xx,double yy,double zz)
      :x(xx),y(yy),z(zz)  //die Member-Variablen x,y,z werden gesetzt, deswegen kann man x=xx;  x=xx; z=zz weglassen
    {
    }
    
    double Punkt::betrag()
    {
      return sqrt((x*x)+(y*y)+(z*z));
      //du kannst betrag nichts zuweisen, da eine funktion
      //durch return ... gibt man den Rückgabewert der Funktion an
      //und xx, yy, zz kannst du hier nicht verwenden, hier gibt es nur die
      //Member der Klasse (x,y,z)
    }
    
    Punkt& Punkt::operator+=(const Punkt& b)
    {
       //durch diesen Operator kannst du später folgendes machen:
       //Punkt a;
       //Punkt b;
       //a += b;  //a ist danach a + b, geht auch so "a = a + b;"
    
       x += b.x;
       y += b.y;
       z += b.z;
       return *this;
    }
    
    Friend-Funktionen sind keine Methoden der Klassen und bekommen keinen Zeiger auf das jeweilige Objekt übergeben, werden wie normale Funktionen deklariert, also ohne Punkt::...
    Ergibt aber hier keinen Sinn, würde es so mahcnen: P1.ausgeben(ostream os) 
    void anzeigen(ostream os, const Punkt& p)
    {
       //tja hier gibts du wohl den Punkt als Stream aus
    }
    
    int main()
    {
    	Punkt P1(3,4,0);			// Objekt P1 vom Typ Punkt mit eigenschaften
    	Punkt P2(0,0,3);			//  x=0, y=0 , z=3 ;
    	cout << P1.betrag() << endl; // Eigenschaft betrag von Punkt 1
    	anzeigen(cout, P1);
    	P1+=P2;
    	anzeigen(cout, P1);
    }
    


  • vielen dank ,eure antworten helfen mir schonmal sehr weiter 🙂

    werde mich morgen früh weiter damit beschäftigen.

    gute nacht 👍

    peter



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C++ (auch C++0x und C++11) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten