Ausgabeoperator als friend zweier Klassen



  • Hallo!

    Ich hab zwei Klassen und soll einen Ausgabeoperator schreiben der friend beider Klassen ist. Ich dachte bisher immer, das geht nur wenn die eine Klasse von der anderen erbt.
    Könnt Ihr mir verraten wie die Sytax dazu aussieht?

    #include<iostream>
    #include<vector> 
    using namespace std;
    
    class Mitarbeiter{
    	  private:
    	  		  string name;
    	  		  float gehalt;
    
    	  public:
    	  		 Mitarbeiter(string n,float g):name(n),gehalt(g){}	
    			 friend  ostream& operator<<(ostream&, const Abteilung&);	  
    	  };
    
    class Abteilung{
    	  private:
    	  		  vector<Mitarbeiter> angestellte;
    	  		  string bezeichnung;
    	  public:
    	  		 Abteilung(string b):bezeichnung(b){}
    			  friend  ostream& operator<<(ostream&, const Abteilung&);
    
    	  };	  
    
    ostream& operator<<(ostream& os, const Abteilung& z)
    {  
       os << z.name << " , " << z.gehalt << endl; //erlaubt, da friend-Funktion
       return os;
    } 
    
    int main()
    {
    Abteilung obj;
    
    cout << obj;
    
    return 0; 	
    }
    

    Lg Caro


  • Mod

    Hier stand Quatsch.

    Verbesserung: Die Syntax müsste schon richtig sein, wie du sie dort hast. Jetzt musst du nur noch eine sinnvolle Semantik implementieren.



  • In meinem operator ist ja das zweite Argument vom Typ Klasse Abteilung.
    Ich muss nun aber ein Attribut von der Klasse Mitarbeiter ausgeben.
    Mein Compiler sagt mir das meine Sytax so nicht stimmt...ich hab nur keine Idee wie der Operator sonst aussehen müsste



  • Ich denke der Hintergrund ist einfach der, dass du dann aus dem operator<< der Abteilung gleich auf die private Member der Klasse Mitarbeiter zugreifen sollst.
    Abteilung speichert ja in einem vector die ganzen Mitarbeiter. Diese haben einen namen und ein gehalt. operator<< (ostream, Abteilung) muss dann auch ein friend von Mitarbeiter sein!

    Nebenbei ist das scheußlich, so viele friends zu haben 😃
    Gib Mitarbeiter und Abteilung const-Methoden um auf die Member lesend zugreifen zu können, und die Kapselungsaufweichung durch friend hat sich erledigt!



  • Danke für Deinen Tipp!
    Ich versuche gerade eine alte Klausuraufgabe zu lösen und muss mich da leider an die Angaben halten... 😞


  • Mod

    fischldi schrieb:

    In meinem operator ist ja das zweite Argument vom Typ Klasse Abteilung.
    Ich muss nun aber ein Attribut von der Klasse Mitarbeiter ausgeben.
    Mein Compiler sagt mir das meine Sytax so nicht stimmt...ich hab nur keine Idee wie der Operator sonst aussehen müsste

    Ich nehme doch mal an, dass du bei der Ausgabe der Abteilung die Mitarbeiter der Abteilung ausgeben sollst. Also einfach den vector durchgehen und alle ausgeben.

    edit: Oh, ein bisschen spät, meine Antwort.



  • Ok, hier ein paar Verbesserungen:

    #include<iostream>
    #include<vector>
    using namespace std;
    
    class Abteilung; // forward-declaration notwendig für friend-Deklaration
    class Mitarbeiter{
          private:
                    string name;
                    float gehalt;
    
          public:
                   Mitarbeiter(string n,float g):name(n),gehalt(g){}   
                 friend  ostream& operator<<(ostream&, const Abteilung&);     
          };
    
    class Abteilung{
          private:
                    vector<Mitarbeiter> angestellte;
                    string bezeichnung;
          public:
                   Abteilung(string b):bezeichnung(b){}
                  friend  ostream& operator<<(ostream&, const Abteilung&);
    
          };     
    
    ostream& operator<<(ostream& os, const Abteilung& z)
    {  
       os << z.bezeichnung << " , "/* << z.gehalt*/ << endl; //erlaubt, da friend-Funktion
       // Hier stand eigentlich nur Murks :D
       // Du übergibst ein "Abtielung z" und tust so als wäre es ein Mitarbeiter, tststs :P
       return os;
    }
    
    int main()
    {
    Abteilung obj("Hauptverwaltung");
    // Notwendiges Argument, da kein Standardkonstruktor vorhanden ist!
    
    cout << obj;
    
    return 0;    
    }
    

    So kompiliert das auch anstandslos!

    Ansonsten soll wohl operator<< für Abteilung die ganzen Mitarbeiter ausgeben, eine for-Schleife tut das sehr schön.



  • Vielen Dank für deine Antwort!
    Wir haben das mit der STL erst vor ein paar Tagen durchgenommen und ich komm damiot noch nicht so gut zurecht.

    Ja, mein Operator soll mir den Namen der Abteilung sowie Namen und Gehalt der Mitarbeiter ausgeben.

    Heisst,mein Operator muss den Container vektor ausgeben.Kennt hier wer ein gutes Tutorial zum Thema?



  • fischldi schrieb:

    Kennt hier wer ein gutes Tutorial zum Thema?

    Zur STL findest du hier eine gute Einführung (auch Teil 2 und 3 des Artikels sind nützlich).


Anmelden zum Antworten