VC++: Structe in Vector<vom typ struct> packen

Bl@ckD0G

Lieutenant
Dabei seit
Nov. 2002
Beiträge
726
HI!

Habe mir mal überleget eine kleine DVD-DB anzulegen, in die der Benutzer Name, CD(Anzahl), und Foramt eintragen kann.

Ich wollte das mit einem Struct machen:
struct dvdinfo {
string name;
int cds;
string format;
int ID;
};
Meine Variable ist: dvdinfo inhalt;
dann hab ich einen vector<dvdinfo> data
angelegt.

Jetzt will ich irgendwie quasi die Infos von einem Film in ein Element des Vectors schreiben, das dann wiederrum diese 4 "Unterelemente" hat.
So lese ich die sachen ein: cin >> inhalt.cds;
und dann will ich gleich danach die auch im Vector speichern mit:
data.push_back(inhalt.cds); aber das geht nicht!
Ich weiß grad nicht, wie man das richtig machen kann, bzw ob das so geht, wie ich mir das vorstelle.

Fehler meldung, die auf das push_back(inhalt.cds) zeigt lautet wie folgt:

"error C2664: 'std::vector<_Ty> :: push_back': Konvertierung des Parameters 1 von 'int' in 'const dvdinfo &' nicht möglich
with
[
_Ty=dvdinfo
]
"

Hoffe Ihr versteht mich und könnt mir bissl helfen ;)

Danke

Gruß
Doggy
 

Herbert2221

Cadet 4th Year
Dabei seit
Juli 2001
Beiträge
87
Du hast nur einen kleinen Fehler gemacht.
Du hast einen Vektor vom Typ dvdinfo und versuchst nun inhalt.cds einzutragen. Das ist ein int.

Du musst stattdessen einfach push_back(inhalt); machen und die ganze Struktur übergeben. Dann klappt das auch.
 

Bl@ckD0G

Lieutenant
Ersteller dieses Themas
Dabei seit
Nov. 2002
Beiträge
726
Danke, das geht so.

Mal sehn ob ich das jetzt richrig verstanden hab.

ich mach dann halt immer:

cin >> inhalt.cds;
cin >> inhalt.ID;
cin >> inhalt.name;
etc..
und am ende der schleife mach ich dann einfach
data.push_back(inhalt);

dann wären alle infos zu meinem "1. Film" in dem [0] Element beim nächsten Schleifen durchlauf wäre dann alles im [1] Element.

Wenn ich jetzt auf meinen "2. Film" zugreifen will also sagen wir auf die CD Anzahl, dann müsste ich das wie folg tmachen ?

data[inhalt.cds[2]]
hm ne jetzt hörts schon auf... weiß jetzt gar nicht wie ich drauf zugreife
Kannst du mir das bitte noch sagen?

Danke schonmal ;)
 

Herbert2221

Cadet 4th Year
Dabei seit
Juli 2001
Beiträge
87
Du versteifst dich irgendwie auf dieses int-Element deines structs, oder ?
Wenn du data[inhalt.cds[2]] machst, dann interpretierst du sozusagen das int-Feld inhalt.cds als Array. Das geht natürlich nicht.

Zum Abfragen des zweiten Elements machst du: inhalt=data[1];

Das zuerst eingespeicherte ist in data[0], der zweite Datensatz in data[1] und so weiter...
 

Bl@ckD0G

Lieutenant
Ersteller dieses Themas
Dabei seit
Nov. 2002
Beiträge
726
ok danke.

Aber mit dem versteifen auf das int feld, war nur ein beispiel.

inhalt=data[1]; das 's schon mal gut zu wissen.
Nur meinte ich, wie ich jetzt auf eines dieser Unterelemente zugreifen kann sagen wir halt mal den namen des Films was ja ein string ist.
Oder geht das gar nicht so direkt?

cout << inhalt=data[1].name;
das schlägt mir VC sogar vor, nur wenn ich es dann kompiliere sagt er mir:

error C2679: Binärer Operator '<<': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operator vom Typ 'dvdinfo' akzeptiert (oder keine geeignete Konvertierung möglich)

Sorry, dass ich SOWAS frage, hab mir Accelerated C++ gekauft, hab da aber nicht alles verstanden bei structen... (wie dir vielleicht schon aufgefallen ist :( )

Danach frag ich nichts mehr, versprochen ;)
 

Herbert2221

Cadet 4th Year
Dabei seit
Juli 2001
Beiträge
87
cout << inhalt=data[1].name;
Nehmen wir das mal auseinander:

data[1] ist das 2. Element im Vektor. Es ist vom Typ dvdinfo.

data[1].name ist ein string. Den könntest du ausgeben. Aber:

inhalt=data[1].name passt so nicht. Du weist einer dvdinfo-Variable (inhalt) einen String-Wert zu. Das geht nicht.

Der Compiler meckert aber aus einem anderen Grund:
Wenn du eine Zuweisung hast, dann ist der Rückgabewert auch vom Typ des lvalue.
Also inhalt=data[1].name steht praktisch für einen dvdinfo-Wert.

Wenn du nun cout << inhalt=data[1].name machst, dann gibst du einen dvdinfo-Wert an cout. cout weis nicht, wie es so einen Wert ausgeben soll. Deshalb auch der Fehler "keine geeigne Konvertierung gefunden".

Richtig ist es so:
inhalt=data[1];
cout << inhalt.name;

oder :
cout << data[1].name;

Ich hoffe, das war verständlich. Im Übrigen kannst du mich auch gerne weiter fragen. Wenn ich Zeit finde, werde ich auch antworten.
 

Bl@ckD0G

Lieutenant
Ersteller dieses Themas
Dabei seit
Nov. 2002
Beiträge
726
OH ja, danke, das war sehr verständlich!
Denke jetzt werd ich das Proggy auch ohne weitere Hilfe fertigstellen können. ;)

Sollte ich aber noch ein schwerwiegendes Problem haben (*hust*), werd ich gern auf dein Angebot zurück kommen *g* , Danke!

Gruß
Doggy
 
Top