Streamausgabe in einer class sowie speichern



  • Hi erstmal,
    bin ganz neu hier und auch ein Neueinsteiger in C++. Ich studiere Bauwesen und wir haben da auch Programmiersprache 1 wobei wir C++ und maple arbeiten. C++ war für mich bisher einfach bis wir nun zu den Klassen gekommen bin und ich die letzten tutorien leider krank war.

    Ich muss folgende Aufgabe machen:
    a) Erstellen Sie in der Datei MaillingList.cpp eine Klasse MailingList , sodass
    das Programm funktioniert. Die Klasse besitzt die privaten Attribute string
    name und vector<string> users . Programmieren Sie folgende Methoden:
    MailingList(const char* n) Konstruktor, der den Namen setzt.
    void add(const string& user) h¨angt user an users an.
    void list(ostream& out = cout) listet users auf, ein User pro Zeile.
    b) Schreiben Sie eine befreundete Streamausgabe, die ausgibt:
    MailingList "..." hat die Mitglieder:
    ...
    ...
    c) Schreiben Sie eine Methode
    void save(const string& filename) , die die Mitglieder in die Datei speichert.
    d) Schreiben Sie einen Destruktor, der (falls es Mitglieder gibt) die User in der Datei
    name .dat ( name ist der Name der MailingList!) sichert und ausgibt:
    Sichere MailingList ... in Datei ... Orientieren Sie sich an SimpleStat ,
    wo ¨ahnliche Methoden existieren.

    Aufgabe a) habe ich nun teilweise lösen können wobei ich das mit der void list nicht hinbekomme. Aufgabe c und d habe ich noch nicht durchschaut

    Bisher habe ich folgendes gemacht:

    /*
     * 	MailingList:  Eine Kleine Klasse mit Strings
     *
     */
    
    #include <iostream>
    #include <cstdlib>
    #include <string>
    #include <vector>
    #include <fstream>	// filestream-Klassen
    #include <iomanip>
    
    using namespace std;
    
    class MailingList { 		// hier fehlt noch einiges
    private:
    	string name;
    	vector<string> users;
    public:
    	MailingList (const char* n):name{n}
    	{	name = n;}
    	void add (const string& user) {users.push_back(user);}
    	void list (ostream& out = cout)                         // was beudetet das ostream& out = cout?
    	{
    	for (auto t : users) {
    		cout << t << "\n";
    	}}
    
    	friend ostream& operator<<(ostream& out, const MailingList& ml);
    };
    
    ostream& operator<<(ostream& out, const MailingList& ml)
    {	cout << "Die MailingList \"" << ml.name << " hat die Mitglieder:\n";
    	//ml.print(out);  // muss ich hier eine Funktion um vektoren auszugeben programmieren? aber ist das nicht schon die void list in der klasse mailing list?
    
    	return out;
    }
    
    int main()
    {	MailingList C{"Die C++-Gurus"};
    
    	C.add("Robert");
    	C.add("Thomas");
    	C.add("Reinhard");
    	C.add("Daniel");
    	C.add("Clemens");
    	C.add("Michael");
    	C.add("Robert");
    	C.add("Reinhard");
    
    	cout << C << '\n';
    	//C.save("Testfile");
    
    	return EXIT_SUCCESS;
    }
    

    Ich bin für jeden Tipp dankbar



  • Benutze Codetags!

    Falls das

    muss ich hier eine Funktion um vektoren auszugeben programmieren? aber ist das nicht schon die void list in der klasse mailing list?

    die Fragen sein sollen:
    Nein. Ja



  • sorry codetags hab ich vergessen, hab ich editiert.



  • ok Aufgabe a un b erledigt



  • Wenn ich dies mache bekomme ich den Fehler: [...]

    Jo. Du versuchst eine nicht-konstante Methode auf einem konstanten Objekt aufzurufen.

    was beudetet das ostream& out = cout?

    Das bedeutet Referenz auf das Objekt cout . Aber der Parameter macht laut deinem Funktionsrumpf nur wenig Sinn. Müsstest eigentlich auch ne Warnung bekommen, dass du unbenutztes Zeug anlegst.



  • maenne7445 schrieb:

    Ok sprich ich schreibe anstatt
    ml.print(out);

    Du kannst einfach ml.list() schreiben, weil der Parameter ja bereits mit cout vorbelegt ist.

    ml.list(); // entspricht ml.list(cout);
    

    Schau mal die Dokumentation von cout an, cout ist vom Typ "ostream".

    Du übergibt also in der Funktion list die Referenz auf einen ostream.

    void list(ostream& out) // ohne vorgegebenen Parameterwert
    
    void list(ostream& out = cout) // mit vorgegebenem Parameterwert
    


  • vielen Dank für eure Antworten, find es einfach toll dass sich manche Leute die Zeit nehmen solchen noobs wie mir in einem Forum weiterzuhelfen.

    Die Aufgaben a, b, c konnte ich nun wie folgt lösen:

    /*
     * 	MailingList:  Eine Kleine Klasse mit Strings
     *
     */
    
    #include <iostream>
    #include <cstdlib>
    #include <string>
    #include <vector>
    #include <fstream>	// filestream-Klassen
    #include <iomanip>
    
    using namespace std;
    
    class MailingList { 		// hier fehlt noch einiges
    private:
    	string name;
    	vector<string> users;
    public:
    	MailingList (const char* n):name{n}
    	{	name = n;}
    	void add (const string& user) {users.push_back(user);}
    	void list (ostream& out = cout) const
    	{
    	for (auto t : users) {
    		cout << t;
    			cout << '\n';
    	}}
    	void save (const string& filename) {
    
    			 ofstream outFile;
    			 outFile.open(filename);
    			 for (const auto &e : users) outFile << e << "\n";}	 // the important part
    	friend ostream& operator<<(ostream& out, const MailingList& ml);
    };
    
    ostream& operator<<(ostream& out, const MailingList& ml)
    {	cout << "Die MailingList \"" << ml.name << " hat die Mitglieder:\n";
    	ml.list(out);
    
    	return out;
    }
    
    int main()
    {	MailingList C{"Die C++-Gurus"};
    
    	C.add("Robert");
    	C.add("Thomas");
    	C.add("Reinhard");
    	C.add("Danielt");
    	C.add("Clemens");
    	C.add("Michael");
    	C.add("Robert");
    	C.add("Reinhard");
    
    	cout << C << '\n';
    	C.save("Testfile");
    
    	return EXIT_SUCCESS;
    }
    

    Nun fehlt mir noch Aufgabe d:
    d) Schreiben Sie einen Destruktor, der (falls es Mitglieder gibt) die User in der Datei
    name .dat ( name ist der Name der MailingList!) sichert und ausgibt:
    Sichere MailingList ... in Datei ... Orientieren Sie sich an SimpleStat ,
    wo ¨ahnliche Methoden existieren

    Wobei mir hier schonmal die Aufgabenstellung nicht so ganz klar ist.



  • void list (ostream& out = cout) const
        {
        for (auto t : users) {
            cout << t;
            cout << '\n';
            }
        }
    

    Der Parameter "out" wird in "list" nicht verwendet. Überleg mal, was du da übergibst und was du damit machen könntest. 😉



  • maenne7445 schrieb:

    Nun fehlt mir noch Aufgabe d:
    d) Schreiben Sie einen Destruktor, der (falls es Mitglieder gibt) die User in der Datei
    name .dat ( name ist der Name der MailingList!) sichert und ausgibt:
    Sichere MailingList ... in Datei ... Orientieren Sie sich an SimpleStat ,
    wo ¨ahnliche Methoden existieren

    Wobei mir hier schonmal die Aufgabenstellung nicht so ganz klar ist.

    Eigentlich hast du ja schon alles dafür zusammen.

    1. Liste enthält Daten?
    2. Daten speichern (da gibt es schon eine Funktion dafür)
    3. Daten auflisten (dafür ebenfalls)



  • Noch was:

    void list (ostream& out = cout) const
    {
        for (auto t : users)
        {
            cout << t;
            cout << '\n';
        }
    }
    
    void save (const string& filename)
    {
        ofstream outFile;
        outFile.open(filename);
        for (const auto &e : users)
        {
            outFile << e << "\n";
        }
    }
    

    Fällt dir hier eine Codeverdoppelung auf?

    Vorausgesetzt du änderst die Funktion "list" korrekt, wie lässt sich diese vermeiden?



  • hmm ok stimmt out wird in der function list nicht verwendet, aber ich checks nicht ganz wie ichs sonst hinbekomme, ist gerade bissl zu spät für mich und muss das morgen abgeben. Werds wohl einfach so abgeben (außer ich bekomme noch die erleuchtung oder es macht mir wer), sitz schon den ganzen nachmitag bei dem käse. Aber vielen dank für die Infos


Log in to reply