Initialisierungsliste für dynamische Arrays?

7

Es ist möglich, der Definition eines statischen Arrays eine Initialisierungsliste zu geben. Beispiel:

%Vor%

Ist eine ähnliche Initialisierungsliste für ein dynamisches Array möglich?

%Vor%

Das ist näher an dem, was ich versuche zu tun:

%Vor%

Bei der Initialisierung sollte nicht der Standardkonstruktor aufgerufen werden, sondern foo: foo (void *).

Der Punkt, eine statische Initialisierungsliste für ein dynamisches Array zu haben, könnte im Falle der Just-In-Time-Kompilierung für Beschleunigerkerne nützlich sein, die nur eine begrenzte Menge an Stapel zur Verfügung haben, aber gleichzeitig Ihre Objekte mit einer statischen Initialisiererliste (Beschleunigerkompilierzeit = Hostlaufzeit).

Ich nehme nicht an (da dies erfordern würde, dass der Compiler zusätzlichen Code erzeugt, nämlich die Werte der Argumente in den Heapspeicherort zu kopieren). Ich denke, C ++ 0x unterstützt etwas davon, aber ich kann es nicht verwenden. Im Moment könnte ich ein solches Konstrukt benutzen. Vielleicht kennt jemand einen Trick ..

Am besten!

    
ritter 19.08.2011, 16:56
quelle

5 Antworten

9

Nein, das kannst du nicht tun.

Ich denke, C ++ lässt das nicht zu, weil das Erlauben einer solchen Sache keine nice-to-have -Funktion der Sprache hinzufügt. Mit anderen Worten, was wäre der Sinn des dynamischen Arrays, wenn Sie einen statischen Initialisierer verwenden, um ihn zu initialisieren?

Der Punkt des dynamischen Arrays besteht darin, ein Array der Größe N zu erstellen, das zur Laufzeit bekannt ist, abhängig vom tatsächlichen Bedarf. Das heißt, der Code

%Vor%

macht weniger Sinn als das Folgende:

%Vor%

Wenn das so ist, wie können Sie die Anzahl der Elemente im statischen Initialisierer angeben, weil N erst zur Laufzeit bekannt ist?

Nehmen wir an, dass Sie das schreiben dürfen:

%Vor%

Aber welchen großen Vorteil haben Sie, indem Sie das schreiben? Nichts. Sein fast ist dasselbe wie:

%Vor%

Der wirkliche Vorteil wäre, wenn Sie das für Arrays von N -Elementen schreiben könnten. Aber dann ist das Problem:

%Vor%     
Nawaz 19.08.2011, 17:09
quelle
10

Zu der Zeit, als das OP diese Frage gestellt hat, war die C ++ 11-Unterstützung noch nicht sehr verbreitet, weshalb die angenommene Antwort dies nicht möglich macht. Das Initialisieren eines dynamischen Arrays mit einer expliziten Initialisierungsliste sollte jetzt jedoch in allen wichtigen C ++ - Compilern unterstützt werden.

Die Syntax new int[3] {1, 2, 3} wurde in C ++ 11 standardisiert. Zitieren der neuen Ausdruck Seite auf cppreference.com:

  

Das von einem new-Ausdruck erstellte Objekt wird nach folgenden Regeln initialisiert:
  ...
  Wenn type ein Array-Typ ist, wird ein Array von Objekten initialisiert:
  ...
  Wenn Initialisierer eine in Klammern eingeschlossene Liste von Argumenten ist, wird das Array aggregiert initialisiert. (seit C ++ 11)

In Anbetracht des Beispiels des OP ist das Folgende vollkommen korrekt, wenn C ++ 11 oder neuer verwendet wird:

%Vor%

Beachten Sie, dass wir durch das Bereitstellen von Zeigern in der Initialisierungsliste den Compiler dazu bringen, den foo(void * ptr) -Konstruktor (und nicht den Standardkonstruktor) anzuwenden, was das gewünschte Verhalten war.

    
DaoWen 20.06.2016 02:43
quelle
2

Nein, Sie müssen die Elemente dynamisch erstellen.

Alternativ können Sie ein lokales Array verwenden und seine Elemente über diejenigen des dynamisch zugewiesenen Arrays kopieren:

%Vor%

In der eingeschränkten Version, bei der alle Elemente auf 0 gesetzt werden, können Sie ein zusätzliches Klammerpaar im Aufruf new verwenden:

%Vor%

Aber Sie scheinen nach einer anderen Sache zu suchen.

    
quelle
0

Da Sie eine echte Klasse sind, die komplexer ist als ein int und aus unterschiedlichen Werten konstruiert ist, ist es kompliziert. Ein Vektor kann mit Iteratoren erstellt werden, wenn Sie ein bestehendes Array / Vektor mit den korrekten Werten für den Standardwert haben, oder Sie müssen Placement neu verwenden.

%Vor%

Offensichtlich ist der Vektor der bevorzugte Weg, dies zu tun.

    
Mooing Duck 19.08.2011 17:16
quelle
0

Die Initialisierungsdaten müssen irgendwo liegen. Nenne es einfach.

z. B.

%Vor%

BEARBEITEN : Ein Thinko im obigen Code wurde korrigiert. Ich beeilte mich, ein Beispiel auf Anfrage hinzuzufügen. Was ich also gemacht habe, benutzte irrtümlich den Rückgabewert von std::copy .

Prost & amp; hth.,

    
Cheers and hth. - Alf 19.08.2011 16:59
quelle

Tags und Links