PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ Objekte speichern



jancarsten
12-10-2004, 20:35
Hallo!

Ich habe eine Frage zum Speichern von Objekten. Also ich habe eine Klasse DVD mit den Variablen Länge, Titel, und DVD_NR. Diese Variablen setze bzw. rufe ich mit den get bzw. set Methoden ab. Jetzt möchte ich aber solch ein Objekt mit den Abgefragten Variablen in eine Liste abspeichern so dass ich z.b gezielt nach der DVD_NR suchen kann. Ich gebe z.B. die DVD's 1-8 mit den nötigen Angaben ein und möchte hinterher gezielt z.B. DVD3 ausgeben lassen. Wie mache ich das bzw. wie speichere ich diese Obejkte in eine Liste oder Array?

greez
jancarsten

Wishmaster
12-10-2004, 21:00
Hallo jancarsten,

also ich empfehle Dir das ganze als dynamische Liste zu machen. Dazu kannst Du entweder STL verwenden oder alles von Hand schreiben, dabei erweiterst Du Deine Klasse um einen Pointer (next) auf ein Objekt (der selben Klasse).
Das erste Objekt initialisiert Du halt wie bisher. Bei jedem neuen durchläufst Du die Liste bis zum Ende und fügst es dort z.B. als object->next ein.

So kannst Du Dich dann immer von Objekt zu Objekt durchhangeln.

bye,
Wishmaster

P.S.: Warte aber lieber nochmal auf eine Antwort der Pros in diesem Board! :rolleyes:

jancarsten
12-10-2004, 21:09
THX erstmal

Hab noch vergessen zu sagen, dass das ganze erstmal nur temporär sein soll(so lange das prog. läuft)

greetz
Jancarsten

P.S Ein kleiner Codeauszug wäre nicht schlecht ;)

Wishmaster
12-10-2004, 21:14
Hab noch vergessen zu sagen, dass das ganze erstmal nur temporär sein soll(so lange das prog. läuft).


Ja, das ist in beiden Fällen so, die Daten sind nach dem Beenden des Programmes futsch.

bye,
Wishmaster

jancarsten
12-10-2004, 21:30
ich noch mal *g*

Kleine verständnisfrage.

Ich mache z.B. Folgendes:

DVD newdvd[MAX]; // sovern das geht bin noch ein c++ Anfänger

newdvd[0]= new dvd(var1,var2,var3);
newdvd[1]= new dvd(var4,var5,var6);

for(i=0;i<=newdvd.length;i++) // bekommt man so auch die länge eines arrays raus
{
cout << newdvd[i]; //gibt den datensatz aus
}

delete newdvd[0];

Funktioniert das so wie ich mir das überlegt habe?

(Kanns grad nicht testen da ich an dem rechner von meinem Vater sitze)

locus vivendi
13-10-2004, 09:34
Funktioniert das so wie ich mir das überlegt habe?

Du hast vorher Java programmiert, oder?

DVD newdvd[MAX]; --> Das geht
newdvd[0]= new dvd(var1,var2,var3); --> Das geht so nicht, denn das Array das du oben definiert hast speichert keine Zeiger, sondern "volle" Objekte. Das hier würde gehen:
newdvd[0] = DVD(var1, var2, var3);

for(i=0;i<=newdvd.length;i++) --> Das wäre Java (newdvd.length). Aber du weißt die Größe ja bereits, nämlich "MAX".

delete newdvd[0]; --> Das kompiliert nicht, und wäre auch überflüssig. Die Lebenszeit von "newdvd" wird vom Compiler gesteuert.

jancarsten
13-10-2004, 09:46
Moin!

Thx für die Antwort.

Wie sieht es den mit der cout Zeile aus geht das so? Möchte mir einfach nur die DVD's mit Titel usw. anzeigen lassen.

"for(i=0;i<=newdvd.length;i++) --> Das wäre Java (newdvd.length). Aber du weißt die Größe ja bereits, nämlich "MAX"."

Jupp die Größe kenne ich schon aber wenn z.b. in der DVD DB nur sagen wir mal 15 einträge drin sind ,dann bringt es ja nix ,wenn ich das ganze array ausgebe sagen wir mal MAX ist 150.Deshalb wollte ich ermitteln wie viel Einträge vorhanden sind. Geht das mit sizeof()?

Und ja ich komme aus der Java Welt ;)

greetz
jancarsten

locus vivendi
13-10-2004, 12:04
Jupp die Größe kenne ich schon aber wenn z.b. in der DVD DB nur sagen wir mal 15 einträge drin sind ,dann bringt es ja nix ,wenn ich das ganze array ausgebe sagen wir mal MAX ist 150.Deshalb wollte ich ermitteln wie viel Einträge vorhanden sind. Geht das mit sizeof()?

[ Ungefähr die selbe Frage habe ich hier vor kurzem schon mal beantwortet, vielleicht sollte man hier eine FAQ einrichten...? ]

Nein, sizeof kannst du nur mit Arrays verwenden die mit einer Größe deklariert wurden. Sobald du Daten hast die sich zur Laufzeit ändern, ist sizeof ungeignet. Um eine kurze Antwort zu geben: Du könntest entweder ein Array dynamisch anlegen (mit "new []") und die Größe selber speichern, oder einen Container verwenden (z.B. std::vector). Letzeres ist häufig die bessere Wahl.

Bezüglich "cout". Das funktioniert, aber nur vorrausgesetzt du hast einen passenden Ausgabe Operator (stream insertion operator) für deine Klasse geschrieben. Aber das werde ich hier nicht erklären, das guckt man am besten in einem Buch oder Tuturial nach.

anda_skoa
13-10-2004, 20:11
Am Besten genau wie in Java einen Container verwenden, dessen Länge nicht festgelegt wird.

So wie du in Java zB einen java.util.Vector verwenden könntest, kannst du das in C++ mit std::vector machen



#include <vector>

// ...
std::vector<DVD> dvds;

dvds.push_back(DVD(var1, var2, var3)); // einen neuen Eintrag anhängen

for (uint i = 0; i < dvds.size(); ++i)
{
std::cout << dvds[i].getTitle() << std::endl;
}


Drüber iterieren geht natürlich auch mit Iteratoren, die in C++ aber ein bischen anderes zu handhaben sind.

Ciao,
_

jancarsten
20-10-2004, 11:21
THX for help erstmal :D

Habe noch ne Frage. Wenn ich jetzt z.b sagen wir mal ein DB von 20 DVD's angelegt habe und ich z.B. an dem Eintrage Nr. sagen wir mal 5 die var3 nicht nur mit ein Schauspieler sondern mit X schauspielern belegen will. Wie mache ich das? Ich habe mir überlegt das ich die var3 im Objekt DVD als array anlege nur wie übergebe ich dann x Schauspieler and das DVD Objekt so das die Datenmenge minimal ist.

Würde dies auch gehen, wenn ich z.b. die DVD Objekte auf den Filmname überprüfe (sofern möglich) und bei gleichen Objekten nur den Schauspieler in das gleiche Objekt neu anlege?
Welche Techniken gibt es da in C++?

Kurz und bündig gibt es in C++ ein Funktion mit der ich die Eigenschaften eines bestimmten Objekts updaten bzw. ergänzen kann?


mfg jancarsten

P.S. hier kommt noch eine andere Erklärung ;)

Beispiel:

main.cpp


//schnipp

//objekte anlegen
B* b0 = new B(0,abc,x11);
B* b1 = new B(0,abc2,x12);
B* b2 = new B(1231,abc3,x13);
B* b3 = new B(3123,sdfsd,x14);

//schnapp

Soweit so gut. Jetzt hab ich ja eine Liste mit 4 Objekten. Jetzt möchte ich aber bei den Objekten bei der Variable3 nicht nur einen wert sondern x werte angeben können(wenn möglich nachträglich).

Beispiel:

main.cpp


//schnipp

//objekte anlegen
B* b0 = new B(0,abc,x11);
B* b1 = new B(0,abc2,x12);
B* b2 = new B(1231,abc3,x13);
B* b3 = new B(3123,sdfsd,x14);
^------- hier möchte ich z.B. zwei werte angeben beim selben objekt

//schnapp

Also der User wird abegfragt was er machen will. Er gibt die Option für einen Eintrag ergänzen an. Daraufhin bekommt er eine liste mit allen Objekte ausgegeben. Jetzt will der user im Objekt b3 die Variable 3 ändern bzw. einen Eintrage für dieses Obj. ergänzen.

Ausgabe vor der Änderung:



Obj V1 V2 V3 V3.1 V3.2 V3.3
b0 0 abc x11 NULL NULL NULL
b1 0 abc2 x12 NULL NULL NULL
b2 1231 abc3 x13 NULL NULL NULL
b3 3123 sdfsd x14 NULL NULL NULL



Ausgabe nach der Änderung:


Obj V1 V2 V3 V3.1 V3.2 V3.3
b0 0 abc x11 NULL NULL NULL
b1 0 abc2 x12 NULL NULL NULL
b2 1231 abc3 x13 NULL NULL NULL
b3 3123 sdfsd x14 X16 NULL NULL


So hoffentlich ist es jetzt verständlich ;)

anda_skoa
20-10-2004, 16:08
Wenn die Klasse DVD ein Feld haben soll, das mehrere Einträge enthalten kann, aber wo die Anzahl der Einträge nicht vorher festgelegt sein soll, bieten sich die Standardcontainer an, zB std::vector

Falls du dich damit noch nicht so auskennst, probier damit mal außerhalb einer Klasse herum.

Ciao,
_