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! 🙄


Anmelden zum Antworten