2011-01-10 19 views
1

zuteilen Sie so schreiben können:C++ Array-Syntax Frage

int test[] = {1,2,3,4}; 

aber was ist, wenn Sie einen Zeiger verwenden möchten, und es mit neuen zuteilen?

int *test2; 
test2 = new int[]{1,2,3,4}; 

Das funktioniert nicht, was ist die Syntax oder ist es möglich?

+0

möglich Duplikat von [Inline-Array-Initialisierung] (http://stackoverflow.com/questions/4583628/inline-array-initialization) –

Antwort

3

Dies ist einer der Nachteile des aktuellen Standards C++. Initialisierung ist nicht einheitlich. Ihre beste Hoffnung is uniform initialization in C++0x, aber für den Mittelwert, während Sie die Werte nach dem Erstellen des Arrays, z.

int *test2; 
test2 = new int[4]; // Note that you still have to specify the size in C++0x 
test2[0] = 1; 
test2[1] = 2; 
test2[2] = 3; 
test2[3] = 4; 
+2

Es gibt auch Boost.Assign, wenn Sie bereit sind, damit zu spielen. – jalf

+0

@jalf Ja ich habe es benutzt & geliebt, aber heutzutage benutze ich g ++ 4.6 und C++ 0x Unterstützung ist beeindruckend :) – AraK

3

Wenn Sie Compiler supports C++0x

int *test2; 
test2 = new int[4] {1,2,3,4}; // Initializer list in C++0x 

funktionieren würde. Allerdings sollten Sie immer std::vector anstelle von C-Stil-Arrays verwenden, während Sie guten C++ - Code schreiben.

+0

Wenn Sie kein dynamisches Array benötigen, sollten Sie es nicht verwenden. Wenn ein statisches Array geeignet ist, macht das Hinzufügen von Komplexität zu dem Problem keinen "guten C++ Code". Halte es einfach. – Simon

+0

@Simon: Ich habe nur eine mögliche Lösung für das Problem vorgeschlagen. Nicht viel! –

+0

Sauray: Nein, du hast nicht "nur eine Lösung vorgeschlagen". Das war dein erster Satz. Ihr zweiter Satz bot Ratschläge an, denen Simon und ich nicht zustimmen. Aber +1 für deinen ersten Satz :-) – TonyK

2

Die erste Syntax heißt Aggregat-Initialisierung, und Sie können sie nicht auf ein dynamisch zugewiesenes Array anwenden. Bei der dynamischen Zuweisung müssen Sie die Anzahl der Elemente, die Sie initialisieren möchten, in den eckigen Klammern und (optional) den Standardwert in Klammern angeben (wenn das Array initialisiert werden soll). Der Standardwert ist derselbe (falls vorhanden) für alle Elemente.

Vielleicht möchten Sie in die boost :: assign-Bibliothek schauen, die Unterstützung für diese Art der Initialisierung bietet (nicht sicher). Alternativ können Sie (auf Kosten von mehr Code) tun es sich für POD-Typen:

int * array = new int[4]; 
{ 
    int values[] = { 1,2,3,4 }; 
    memcpy(array, values, sizeof(values)); 
} 

oder für Nicht-pod-Typen:

type * array = new type[4]; 
{ 
    type values[] = { 1,2,3,4 }; // assuming type(int) constructor 
    std::copy(values, values+4, array); // better to use some magic to calculate size 
} 

Auf jeden Fall diese beiden Lösungen vor Ort erfordern Aufteilung und die Kopieren (Bit-Größe/C++) in den dynamisch zugewiesenen Speicher.