Feld von Objekten mit unterschiedlichem Konstruktoraufruf
-
Hallo
Ich habe eine Klasse FlyBubble deren Konstruktor ein Argumente
erwartet. Ausserdem habe ich einen Pointer auf Instanzen der
Klasse, diesen habe ich mit "FlyBubble *Bubbles;" deklariert.
Ich benötige ein Feld mit Instanzen meiner Klasse, welche dem
Konstruktur einen unterschiedlichen Parameter übergeben.
Zuerst dachte ich an
"Bubbles=new FlyBubble[DIRECTIONS](0)"
allerdings erzeugt mir das mehrfach das selbe Objekt.
Ich benötige jedoch sowas in der Art wie:
Bubbles[0]=new FlyBubble(0);
Bubbles[1]=new FlyBubble(1);
Bubbles[2]=new FlyBubble(2);
...Wie kann ich das erreichen ohne den Konstruktur unnötig oft
aufzurufen?red
-
vll. definierst in der Bubble klasse ein statischen Zähler , welches sicher immer bei jedem aufruf wenn ein Feld element erzeugt wird..
ist nur so ne Idee..
-
Wie kann ich das erreichen ohne den Konstruktur unnötig oft
aufzurufen?Was meinst du mit unnötig oft? Weniger als einmal pro Objekt geht nicht.
-
mit unnötig mein ich folgendes:
Bubbles=new FlyBubble[DIRECTIONS](0)
Dabei wird der Konstruktur DIRECTIONS-mal aufgerufen.
(Hierrauf bezieht sich das "umsonst", da ich die Einträge direkt mit den von mir gewollten Objekten überschreibe)Im Anschluß daran kommt
for(int i=0;i<DIRECTIONS;++i)
Bubbles[i]=new FlyBubble(i);Dabei wird der Konstruktor nochmal DIRECTIONS-mal aufgerufen
-
Ich glaube Du verwechselst da gerade irgendwas...
Bubbles = new FlyBubble[ANZAHL];Ruft den Constructor ANZAHL mal auf, richtig, aber danach ist es nicht möglich folgendes zu tun:
Bubbles[i] = new FlyBubble(i);Denn Bubbles[i] ist ein Objekt, und kein Zeiger. Du kannst einem Objekt keinen Zeiger-auf-Objekt zuweisen. Wenn Du andererseits jedoch
Bubbles = new FlyBubble*[ANZAHL];machst, wird nicht der Konstruktor von FlyBubble ANZAHL mal aufgerufen, sondern der Konstruktor von FlyBubble*
-
ah stimmt, da hast du natürlich Recht.
Was ich meinte war wohl eher:
for(int i=0;i<DIRECTIONS;++i)
Bubbles[i]=*(new FlyBubble(i));
-
Du kannst Placement new verwenden:
unsigned int i, cnt = 3; // Speicher reservieren Foo *ptr = static_cast< Foo *>( ::operator new( sizeof( Foo )*cnt ) ); // Konstruktor aufrufe for ( i = 0; i < cnt; ++i ) { new( &ptr[ i ] ) Foo( i ); } // Destruktor aufrufe for ( i = 0; i < cnt; ++i ) { ptr[ i ].~Foo(); } // Speicher freigeben ::operator delete( ptr );grüße
-
David_pb schrieb:
Du kannst Placement new verwenden:
Ist euch ein std::vector zu einfach?
-
Genau!
