[Solved] "Einführung in die programmierung mit c++" Kapitel 6 Übung Nr.4
-
@th69
Okay das habe ich jetzt verstanden.
Und wie fülle ich den vector von der Main aus mit den beiden werten ?
Vorher habe ich die einzelnen Datentypen gefüllt und mit einen push_back in den jeweiligen vector gefüllt, wie mache ich das aber jetzt ?
-
Analog, nur daß du eben vorher ein
Name_value
Objekt erstellst (s. Code in meinem ersten Beitrag, nur daß du dann die passenden Parameter übergibst) und diesen dann dem Vector hinzufügst.
-
@th69
Irgendwie werde ich nicht schlau daraus.
Könntest du es mir in einem Code beispiel vllt verdeutlichen ?
-
Ja , könnte ich, aber was lernst du dabei? Die Kunst des Programmierens ist es auch, aus den Fehlern (z.B. Fehlermeldungen des Compilers) zu lernen.
Wenn du nicht weiterkommst, dann zeige deinen Code, aber zuerst versuche es mal selber.
-
@th69
Ich verstehe immer noch nicht wie ich die Parameter übergeben soll.In meinem code steht auch noch nichts besonderes, da ich ja nicht weiß wie ich die Parameter übergeben soll.
#include <iostream> #include <vector> using namespace std; class Name_value{ public: string name; int value; Name_value(string x) :name(x), value(0) {} }; int main(){ vector<Name_value> erg; return 0; } .
-
Du kannst ja die
while
-Schleife zum Einlesen des Namens und des Score aus der Übung übernehmen.
Bei meinem Code änderst du es so ab, daß anstatt "Test" und 42 ebenname
undscore
übergeben werden (das sind aber Grundlagen, welche schon vorher im Buch erklärt werden).Und bei deinem
Name_value
-Konstruktor fehlt noch der 2. Parameter.
-
Name_value nv(name, score);
Und was kann ich damit anfangen ?
Meinen vector kriege ich damit ja dennoch nicht gefüllt.vector<Name_value> x; cin >> nv; x.push_back(nv); // funktioniert ja nicht
Oder füllt man den vector anders, ich kenne es nur so.
-
Doch, die Anweisung
x.push_back(nv);
ist korrekt so (die Variablenv
muß aber natürlich vorher erstellt worden sein), aber die Zeile darüber (so) nicht.vector<Name_value> x; // ich würde die Variable eher "name_values", "nvs" o.ä. nennen string name; int score; cin >> name >> score; Name_value nv(name, score); x.push_back(nv);
PS: Es ginge auch direkt ohne die explizite Variable
nv
:x.push_back(Name_value(name, score));
(aber das ist etwas schwerer zu lesen)
-
@th69
Weshalb funktioniert denn die normale Ausgabe nicht wie sonst ?vector<Name_value> x;
.
.
.cout << x[0];
Das würde ja eigentlich funktionieren aber wieso nicht jetzt ?
-
@skailer sagte in Brauche Hilfe zu einer Aufgabenstellung vom Buche "Einführung in die programmierung mit c++":
Weshalb funktioniert denn die normale Ausgabe nicht wie sonst ?
Weil es für Deinen Typ
Name_value
keinen Operator<<
gibt, der aufstd::ostream
undName_value
passt.Da in Deiner
Name_value
die Datenpublic
sind (was sie aber nicht sein sollten), könnte ein passender Operator so aussehen:std::ostream& operator<<(std::ostream & os, Name_value const & nv) { os << '\"' << nv.name << "\": " << nv.value; return os; }
-
@swordfish
Danke, es funktioniert.
Muss mich dazu aber nochmal einlese, weil ich überhaupt nicht weiß was das ist
-
@skailer sagte in Brauche Hilfe zu einer Aufgabenstellung vom Buche "Einführung in die programmierung mit c++":
weil ich überhaupt nicht weiß was das ist
std::cin
ist eine Referenz auf einenstd::ostream
. Wenn Du nun schreibstint foo = 42; std::cout << foo;
Dann steht da effektiv ein Funktionsaufruf von
operator<<(std::cout, foo);
Das heißt, damit man einen
int
in einenstd::ostream
(woraufstd::cout
verweist) schieben kann, braucht es einen Operator<<
, der auf seiner linken seite einenstd::ostream
und auf seiner rechten einenint
(oder etwas, in das sich einint
implizit konvertieren lässt) akzeptiert. Praktischerweise bringt die Standardbibliothek solche Operatoren für Basisdatentypen wiechar
,int
,long
,float
usw. schon mit.Handelt es sich beim rechten Operanden von
<<
aber wie in Deinem Fall um einen User-defined-type wie zB eineclass
, dann musst Du solch einen Operator selbst schreiben.