Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » beliebige Anzahl von Objekten zur Laufzeit - wie?

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 ]
000
07.11.2005, 18:35 Uhr
Noob2k5



Ich scheitere grade daran eine Lösung zu finden, wie ich beliebig viele Objekte zur Laufzeit erstellen kann.

In einer switch - Anweisung wollte ich einfach bei auswählen einer bestimmten Auswahl ein neues Objekt erzeugen und die Namen jedes neuen Objektes einfach hochzählen so wie ich das mit einem array machen würde.

Quasi so, zu erzeugendes Objekt ist ein neues (Bank)Konto:

C++:
Konto Id[i];
i++;



Ganz so einfach war es dann doch nicht, wie krieg ich es hin beliebig viele Objekte zu erzeugen?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
07.11.2005, 18:48 Uhr
Spacelord
Hoffnungsloser Fall


Zur Laufzeit kannst du beliebig viele Objekte mit new erstellen.Den Zeiger den du dann erhälst musst du in einem geeigneten Container speichern.
Der Variablen ansich dynamisch einen Namen zu geben geht nicht.
Du kannst höchstens in ner std::map einen dynamisch erzeugten string dem Zeiger auf das mit,new erzeugte,Objekt zuweisen.Dann kannst du den Zeiger auf dieses Objekt mit Hilfe dieses strings in der map suchen.

MfG Spacelord
--
.....Ich mach jetzt nämlich mein Jodeldiplom.Dann hab ich endlich was Eigenes.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.11.2005, 10:27 Uhr
Noob2k5




Zitat von Spacelord:
Zur Laufzeit kannst du beliebig viele Objekte mit new erstellen.Den Zeiger den du dann erhälst musst du in einem geeigneten Container speichern.
Der Variablen ansich dynamisch einen Namen zu geben geht nicht.
Du kannst höchstens in ner std::map einen dynamisch erzeugten string dem Zeiger auf das mit,new erzeugte,Objekt zuweisen.Dann kannst du den Zeiger auf dieses Objekt mit Hilfe dieses strings in der map suchen.

MfG Spacelord


Was wäre den ein geeigneter Kontainer? Wenn ich ein Array benutze muss ich mich ja ebenfalls wieder auf ein größe festlegen, die kann man doch nicht zur laufzeit "anpassen".
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.11.2005, 10:38 Uhr
ao

(Operator)


Zum Beispiel std::vector<T> oder std::list<T>

Die Grundanforderung (beliebig viele gleichartige Objekte festhalten) können beide Container. Welcher besser geeignet ist, kommt auf die Anwendung an:

vector ist ein Array, d.h. die Elemente liegen im Speicher benachbart. Das ist günstig, wenn auf existierende Elemente indiziert zugegriffen wird, und ungünstig beim Einfügen und Löschen von Elementen oder beim Sortieren, da müssen nämlich die Inhalte umkopiert werden.

list ist eine verkettete Liste, d.h. jedes Element trägt einen Verweis auf das nächste. Der indizierte Zugriff auf Elemente ist natürlich auch hier möglich, muss aber abgebildet werden auf ein Durchlaufen der Liste vom Anfang (oder auch Ende) bis zum gewünschten Element, das ist performancemäßig ungünstig. Dafür geht das Einfügen, Löschen und Umsortieren rasend schnell, weil nur Referenzen oder Pointer umgesetzt werden müssen.

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
09.11.2005, 13:54 Uhr
Noob2k5



Danke, hat soweit funktioniert - wenn ich 2 Pointer im vector speichere, wird der Destruktor insgesamt 5x aufgerufen.

Wieso so oft? Kann ich nicht ganz nachvollziehen.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.11.2005, 16:54 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


Ohne Code können wir das auch nicht...
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.11.2005, 18:02 Uhr
Noob2k5



Hier mein Code:

C++:
#include <iostream>
#include <vector>
#include <string>

#include "konto.h"

int main(int argc, char* argv[])
{    
    int input;
    
    std::vector <Konto> konten;

    std::cout<<"Bitte geben Sie die Anzahl der zu erzeugenden Objekte an: ";
    std::cin>>input;

    int count;
    for(count=0;count<input;count++)
    {
        Konto * pPoint = new Konto;
        std::cout<<"New pPoint"<<std::endl;
        (*pPoint).SetKtnr(count);
        konten.push_back(*pPoint);
    }
    
    int i;
    for(i = 0; i<count;i++)
    {
    std::cout<<konten.at(i).GetKtnr()<<std::endl;
    }
        
    
    return 0;
}



Meine Headerdatei Konto.h

C++:
#ifndef Konto_H
#define Konto_H
class Konto{

private:
    int ktnr;
    int blz;
    double guthaben;

public:
    Konto();
    ~Konto();
    void SetKtnr(int);
    void SetBlz(int);
    void SetGuthaben(double);

    int GetKtnr(void);
    int GetBlz(void);
    double GetGuthaben(void);
};

Konto::Konto():ktnr(0000),blz(00000),guthaben(000000.00)
{
    std::cout<<"Konstruktor aufgerufen"<<std::endl;
}

Konto::~Konto()
{
    std::cout<<"Destruktor aufgerufen"<<std::endl;
}

void Konto::SetKtnr(int i_ktnr)
{
    ktnr = i_ktnr;
}

void Konto::SetBlz(int i_blz)
{
    blz = i_blz;
}

void Konto::SetGuthaben(double i_guthaben)
{
    guthaben = i_guthaben;
}

int Konto::GetKtnr(void)
{
    return ktnr;
}

int Konto::GetBlz(void)
{
    return blz;
}

double Konto::GetGuthaben()
{
    return guthaben;
}


#endif

Dieser Post wurde am 09.11.2005 um 18:02 Uhr von Noob2k5 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.11.2005, 18:52 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


5, da std::vector normalerweise gleich 5 objekte alloziiert wenn er initial leer ist. und zusätzlich haste noch 2 speicherlöcher.
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
09.11.2005, 21:31 Uhr
Noob2k5




Zitat von FloSoft:
5, da std::vector normalerweise gleich 5 objekte alloziiert wenn er initial leer ist. und zusätzlich haste noch 2 speicherlöcher.


Ah, danke.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
09.11.2005, 22:58 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


noch ne kleine Anmerkung...

C++:
(*pPoint).SetKtnr(count);
//brauchst dir nicht mit dem * operator einen abzukrebsen. Das ist das gleiche wie
pPoint->SetKtnr(count);



wenn du noch um nen konstruktor erweiterst der es dir erlaubt die Ktnr beim erstellen des Objektes gleich zu übergeben kannst du das ganze auch ein wenig abkürzen...

statt

C++:
int count;
    for(count=0;count<input;count++)
    {
        Konto * pPoint = new Konto;
        std::cout<<"New pPoint"<<std::endl;
        (*pPoint).SetKtnr(count);
        konten.push_back(*pPoint);
    }


tut es innerhalb der schleife auch ein einfaches...

C++:
konten.push_back(new konto(count));


dafür musts du dann einfach einen vector von konto-pointern verwenden.... nicht vergessen die am ende auch wieder zu deleten...
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 09.11.2005 um 22:59 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ] [ 3 ]     [ C / C++ (WinAPI, Konsole) ]  


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: