2014-06-10 15 views
10

Erstellen Lassen Sie uns sagen Sie eine Reihe von objectes auf dem Heap wie so schaffen: aufWarum C++ nicht zulassen, dass `new` Konstruktor aufzurufen, wenn Arrays

myClass * objectPtr = new myClass[10]; 

new nur ruft den Standardkonstruktor und (basierend meine Lesungen) erlaubt keinen anderen Konstruktor aufgerufen werden.

Gibt es irgendeine Logik dahinter, warum new keinen anderen Konstruktor aufrufen kann? Es wäre besser scheinen so etwas wie

myClass * objectPtr = new myClass[10](12); 

zu tun, im Gegensatz zu

myClass * objectPtr = new myClass[10]; 
objectPtr[0] = myClass(12); 
objectPtr[1] = myClass(12); 
... 
+3

'-1' für rohen Zeiger und' new' in einer Codezeile. Auch die Frage ist nicht besonders vernünftig, wenn man bedenkt, dass es nicht nur rohe Zeiger, Verfall und nutzlose Zuordnungen verwendet, sondern sich auch auf die Erzeugung von Roh-C-Arrays konzentriert, die im Grunde genommen irrelevant ist. IOW die Antwort könnte sein "weil keine C-Arrays verwenden" (und alle oben genannten Sachen). –

+2

FWIW, kann man das mit einem 'std :: vector' machen zB' std :: vector foo (10, myClass (12)); ' – AndyG

+0

_'Warum erlaubt C++' new' keinen Aufruf von Konstruktoren beim Erstellen von Arrays '_ Da dies nicht der tatsächlichen Syntax des Operators 'new []()' entspricht. –

Antwort

15

Warum C++ nicht zulassen, dass new Konstruktor aufzurufen, wenn Arrays

Es tut zu schaffen. Es ist nur ein bisschen langweilig:

struct my_class 
{ 
    my_class() {} 
    my_class(int, int) {} 
}; 

int main() 
{ 
    my_class* objectPtr = new my_class[3]{my_class(1,2), 
             my_class(), 
             my_class(3,4)}; 
} 
+2

Konstruiert oder ruft er einen Kopieroperator für die erstellten Objekte auf? –

+0

Außer wenn Sie ein Array von 100 Objekten deklarieren, geben Sie 'my_class (a, b)' 100 Mal manuell ein. Angenommen, Sie initialisieren alle erstellten Objekte mit denselben Feldern, gibt es einen Grund, warum C++ keine verkürzte Schreibweise dafür hat? – 1110101001

+2

@ user2612743 Deshalb habe ich "langweilig" gesagt. Ich kann nur über den Grund spekulieren, und das wäre, dass die Leute dieses Zeug sowieso nicht benutzen sollten, sondern stattdessen "std :: vector ". – juanchopanza

-2

Normalerweise werden Sie nicht das gleiche Objekt mehrmals konstruieren wollen, daher können Sie viele Standardobjekte konstruieren und mit einer for Schleife können Sie sie auf Ihre Bedürfnisse ändern.

Eine andere Möglichkeit, die Sie verwenden können, ist:

myClass **ObjectPointers = new myClass*[NUMBER_OF_OBJECTS]; 
for (int i=0; i<NUMBER_OF_OBJECTS; ++i) 
    ObjectPointers[i] = new myClass(1,2,3,...); # <-- non-default constructor 

Auf diese Weise können dynamisch Zeiger auf Objekte zuweisen, die Sie separat erstellen können.

+3

-1: Das erinnert mich daran, wie ich meinen Code geschrieben habe, als ich noch ziemlich jung war, nachdem ich mein erstes und einziges "teach-me-C++" Buch gelesen hatte, das ich aufgrund früheren C-Wissens etwas missverstanden habe. Bitte, ernsthaft, lesen Sie mindestens über std :: vectors, std :: lists und smartpointers, bevor Sie wieder in C++ sind. Glauben Sie mir, es wird Ihnen viele Kopfschmerzen ersparen – quetzalcoatl

+0

Ich weiß alles über die STL-Bibliotheken, danke. Ich bin jedoch ein Student der Informatik und wenn wir C++ - Code üben, werden wir angewiesen, STL nicht zu verwenden. Dem stimme ich jedoch voll und ganz zu. – user3175215

Verwandte Themen