Ergebnis 1 bis 8 von 8

Frage zu friendfunktionen (c++)

  1. #1 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    Hi

    ich soll einen ausgabeoperator als friend funktion einer klasse definieren und damit werte einer anderen klasse ausgeben.

    das sieht wie folgt aus:

    Code:
    class Wurf{
    private:
    	unsigned int erg;
    
    public:
    	Wurf();
    	Wurf(unsigned int);
    	friend ostream& operator<<(ostream&, const Wurf&);
    	friend class Wurfverwaltung;
    };
    
    
    //Klassendeklaration
    
    
    class Wurfverwaltung{
    private:
    	unsigned int n;
    	Wurf* wuerfe;
    public:
    	Wurfverwaltung(unsigned int);
    	Wurfverwaltung(const Wurfverwaltung&);
    	~Wurfverwaltung();
    	unsigned int get_n();
    	Wurfverwaltung& operator=(Wurfverwaltung&);
    	Wurfverwaltung& operator+=(const Wurfverwaltung&);
    	Wurfverwaltung& operator+=(const Wurf&);
    	bool operator==(const Wurfverwaltung&);
    	friend ostream& operator<<(ostream&, const Wurfverwaltung&);
    
    };
    geht aber so nicht, visual studio sagt mir schon ohne kompiliert zu haben, dass es nicht auf .erg zugreifen kann.

    aufruf ist:
    cout<<y.wuerfe[i].erg;

    als hilfe steht bei der aufgabe auch nur folgendes:

    Einen Ausgabeoperator als friend-Funktion der Klasse, welcher alle Würfe unter
    Benutzung des Ausgabeoperators von Wurf ausgibt.
    Hinweis: Um auf das Datenelement von Wurf zuzugreifen, können Sie die Klasse
    Wurfverwaltung als friend von Wurf deklarieren.


    was mach ich falsch? muss ich den ausgabeoperator als funktion aufrufen, oder wie? in normalen memberfunktionen von Wurfverwaltung kann ich auf .erg zugreifen.

    Daepilin ist offline

  2. #2 Zitieren
    Provinzheld Avatar von Cheesecake
    Registriert seit
    Feb 2012
    Beiträge
    266
    Code:
    cout<<y.wuerfe[i].erg;
    Zuerst wird "y.wuerfe[i].erg" ausgeführt und erst dann wird der <<-Operator auf das Ergebnis aufgerufen. Du greifst also außerhalb von der Funktion auf erg zu und das ist nicht erlaubt.
    Cheesecake ist offline

  3. #3 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    wie kann ich das denn anders machen, irgendwie muss das ja gehn, sonst stellen die die aufgabe ja nicht(wir haben n vorgegebenes main programm bekommen, wo wir nur die klassen zu schreiben sollen).

    extra zugriffsfunktion? wobei ansonsten eigentlich jede funktion die wir brauchen und schreiben müssen angegeben ist.

    Daepilin ist offline

  4. #4 Zitieren
    Provinzheld Avatar von Cheesecake
    Registriert seit
    Feb 2012
    Beiträge
    266
    Die Aufgabe wird wird wohl so gemeint sein, dass du das Wurfobjekt an sich an den Streamoperator übergibst und dieser hat dann Zugriff auf erg.
    Cheesecake ist offline

  5. #5 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    meinst du also etwa so: ( kanns nich probieren, hab da zuviel noch nich fertig um das zu kompilieren:

    Code:
    ostream& operator<<(ostream& os, const Wurfverwaltung& y){
    	for(int i(0); i < y.n; i++)
    		cout<<operator<<(cout, y.wuerfe[i]);
    
    	return os;
    }
    muss sagen mit den operatorenaufrufen als funktionen kenn ich mich nich aus, aber da zeigt mir VS zumindest keine fehler an.

    Daepilin ist offline

  6. #6 Zitieren
    Ritter Avatar von ojas
    Registriert seit
    Jun 2008
    Ort
    Erde
    Beiträge
    1.787
    Code:
    ostream& operator<<(ostream& os, const Wurfverwaltung& y)
    {
        for(int i = 0; i < y.n; ++i)
        {
            os << y.wuerfe[i] << " ";
        }
        return os;
    }
    Beachte insbesondere, dass nach os ausgeben werden soll. Das muss nicht gleich cout sein. Es kann zum Beispiel auch eine Datei oder ein String oder eine Netzwerkverbindung sein.
    ojas ist offline

  7. #7 Zitieren
    Ritter Avatar von ojas
    Registriert seit
    Jun 2008
    Ort
    Erde
    Beiträge
    1.787
    Zitat Zitat von Daepilin Beitrag anzeigen
    extra zugriffsfunktion?
    Das wäre auch eine Möglichkeit. Das würde aber (so paradox es auf den ersten Blick erscheinen mag), gegen Datenkapselung verstoßen.

    Extra Zugriffsfunktionen haben die Eigenschaft, dass jeder sie aufrufen kann. Wenn die Daten aber nur an einer oder wenigen bekannten, eng mit der Klasse verbundenen Stellen gebraucht werden, dann ist diese Eigenschaft ein Nachteil.

    friend-Deklarationen hingegen müssen in der Klasse selbst angegeben werden. Die Klasse entscheidet also, wer Zugriff auf ihre Daten hat. Zum Beispiel ist

    ostream& operator<<(ostream& os, const Wurfverwaltung& y)

    kein friend der Klasse Wurf. Braucht es auch nicht zu sein, weil dieser Operator einfach

    ostream& operator<<(ostream& os, const Wurf& y)

    aufrufen kann.

    Üblicherweise bekommen überladene Operatoren, die keine Memberfunktionen sind, friend-Zugriff. Außer natürlich die Zugriffsfunktionen sind aus anderen Gründen schon da.
    ojas ist offline

  8. #8 Zitieren
    Deus Avatar von Daepilin
    Registriert seit
    Oct 2006
    Ort
    NRW
    Beiträge
    11.619
    Jop, danke. Keine Ahnung, warum ich nicht selbst drauf gekommen bin... Hatte ja << schon für die Würfe definiert... Und Nja, bisher wird auch in den beispielprogrammen immer direkt cout genommen, also habe ich das auch gemacht.

    Daepilin ist offline

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •