Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » (dynamische) objekterzeugung und speicherung zur laufzeit

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]
000
18.06.2004, 23:06 Uhr
songbird



Wir wollen ein Objekt zur Laufzeit anlegen, die Attributinhalte sollen durch den Benutzer eingegeben. Das Objekt soll dann an der ersten leeren Stelle in einem Array abgespeichert werden und einmal ausgegeben werden.
Das alles soll nicht dauerhaft, sondern nur zur Laufzeit gespeichert werden.


C++:
Dvd films[50];

char newTitle[]  = "";
char newRegi[] = "";
char newGenre[] = "";
int newId = 0;
int newLength = 0;
char newDate[] = "";

void newFilm()
{
    bool valid = false;
    int checkpos = 0;
    Dvd* dvd6;
    
    cout << "Anlegen neuer DVD's" << endl << endl <<
            "Geben Sie den Namen des Films ein !" << endl;
    cin.getline(newTitle,50);
    cin.ignore(100, '\n'); cin.clear();
    cout << endl << "Geben Sie den Regisseur an !" << endl;
    cin.getline(newRegi,50);
    cout << endl << "Geben Sie das Genre an !" << endl;
    cin.getline(newGenre,50);
    do
    {
        valid = true;
        cout << endl << "Geben Sie die Film-ID an !" << endl;
        cin >> newId;
        for (int i = 0; i < 50; i++)
        {
            if(films[i].getId() == newId)
            {
                valid = false;
                cout << "Die ID ist bereits vorhanden !" << endl;
            }
        }
    }
    while (valid == false);
    
    cout << endl << "Geben Sie die Länge des Films an !" << endl;
    cin >> newLength;
    cout << endl << "Geben Sie das heutige Datum ein !" << endl;
    cin.getline(newDate, 15);
    cin.ignore(100, '\n'); cin.clear();
    
    dvd6 = new Dvd( newTitle, newRegi, newGenre, newId, newLength, newDate);
    
    for (int j = 0; j < 50; j++)
    {
        if(films[j].getTitle() == "unknown")
        {
            films[j] = *dvd6;
            checkpos = j;
            j = 50;
        }
    }
    
    cout << "Sie haben folgenden Film gerade neu angelegt: " << endl <<
            "Filmtitel: " << films[checkpos].getTitle() << endl <<
            "Regisseur: " << films[checkpos].getRegi() << endl <<
            "Genre: " << films[checkpos].getGenre() << endl;
            
}




also wir bekommen keine Fehlermeldung, aber wenn wir den angelegten Film ausgeben wollen, bekommen wir nicht die eingegebenen strings/ints...

Was machen wir falsch???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.06.2004, 23:10 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


also wenn du es in c++ machst nimm doch keine char-arrays sondern std::strings die machen dir das leben viel einfacher.... aussdem brauchst du dich in c++ um speicherallokiererein fast nicht mehr kümmern... dafür gibt es schon fertige klassen... nimm z.b. einen std::vector
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.06.2004, 23:13 Uhr
songbird



irgendwie hab ich das gefühl, dass bei uns an der uni da irgendwas schief läuft... mit den antworten hier kann ich irgendwie immer so gar nix anfangen... uns wird immer gesagt, entweder string oder char-array und "using namespace std"....
wenn wir jetzt mal die char-arrays lassen, geht das trotzdem irgendwie so mit unserem ansatz?

Dieser Post wurde am 18.06.2004 um 23:13 Uhr von songbird editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.06.2004, 23:21 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


naja irgendwie gehts bestimmt aber da verbringt man ja stunden um stunden mit fehlersuchen die man sich auch sparen kann...

um mal ein beispeil mit dem vector zu machen...


C++:
std::vector<int> myArray;  // ob du nun int nimmst oder irgend ein struct ein double oder was auch immer du gerarde willst ist egal der vector frisst alles...

//so jetzt ist der vector noch leer und wir packen drei elemente rein
myArray.push_back(4711);  
myArray.push_back(4712);  
myArray.push_back(4713);

so tolle sache ich musste mich nicht draum kümmern speicher zu allokieren und musste auch nicht ständig checken ob mein allokierter speicher noch reicht macht alles der vector für mich...

arbeiten kann man mit dem ding z.b. wie mit einem array

std::cout<<myArray[0]<<std::endl;
std::cout<<myArray[1]<<std::endl;
std::cout<<myArray[2]<<std::endl;



ums kurz zu sagen schreib dein spass nochmal neu und überleg dir dein design, dann sparst du jede menge zeit beim debuggen...


wie hast du denn dvd definiert?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.06.2004, 23:27 Uhr
songbird



das problem ist,dass wir vectoren noch nciht hatten und auch nicht benutzen sollen.
den speicher zu allokieren nehm ich auch gern in kauf. aber ich glaube dass meine objekterzeugung gar nicht klappt...

hier die dvd-definition:


C++:
Dvd::Dvd(string _title, string _regi, string _genre, int _id, int _length, string _date)
    :title(_title),
     regi(_regi),
     genre(_genre),
     id(_id),
     length(_length),
     date(_date),
     lent(false),
     lent_by("???")
{
}



stimmt denn meine objekterzeugung vom quellcode oben???

Dieser Post wurde am 18.06.2004 um 23:33 Uhr von songbird editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.06.2004, 23:33 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

den speicher zu allokieren nehm ich auch gern in kauf


da merkt man das du das noch nicht gemacht hast

naja da du deinen konstruktor mit bestimmten werten aufrufen willst und keinen defaultkonstruktor verwendest brauchst du ein pointer-array von dvdpointer...


C++:
Dvd **myDVDarray;
Dvd myDVDarray=new Dvd*[50]; //so hier liegt dein eigentliches problem du weisst nicht wieviele dvds du jemals haben wirst... musst dann also wenn die anzahl grösser als in diesem falle 50 wird nachallokieren und die zeiger alle kopieren...

//so wenn du jetzt eine Dvd deinem array hinzufügen willst dann so

myDVDarray[0] = new Dvd(....);



du brauchst also eine variable die dir zählt wieviele elemente schon in deinem array sind und eine die dir sagt wieviel speicher du reserviert hast... wenn anzahl==reserviert und du willst noch eins einfügen musst du nachallokieren (belastende sache)...


am ende nicht vergessen den speicher wieder freizugeben...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.06.2004, 23:43 Uhr
songbird



naja, ich habe auch einen default-konstruktor. aber da ich ja die vom benutzer eingegebenen details nutzen möchte, kann ich diesen default-konstruktor ja schlecht benutzen...
zu der allokierung: bei dem programm handelt es sich "nur" um eine hausaufgabe und unsere hiwis sagten uns, dass wir einfach ein array mit 50 stellen nehmen sollen, da wir noch keinen vector hatten. es wird also nie zu dem fall kommen, dass zeiger kopiert werden müssen.

Wenn ich
C++:
Dvd**films = new Dvd*[50]
nehme, hagelt es Fehler...

und bei meinem oben geposteten quelltext treten ja immerhin keine complilierungs-fehler mehr auf, nur die ausgegebenen werte am ende, stimmen nicht mit denen am anfang überein
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.06.2004, 23:46 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


ach so wenn du 50 als konstannt lassen kannst dann probier mal so...

C++:
Dvd *films[50];


--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 18.06.2004 um 23:46 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.06.2004, 23:51 Uhr
songbird



gibt tausend fehlermendungen. an jeder stelle, an der ich das array verwende... :
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
18.06.2004, 23:52 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


*lol*
ka was du da fabriziert hast....
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ] [ 4 ] [ 5 ] [ 6 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: