Objektarray-Initialisierung ohne Standardkonstruktor
Beachten Sie den folgenden Code:
#include <iostream> class Car { private: Car(){}; int _no; public: Car(int no) { _no=no; } void printNo() { std::cout<<_no<<std::endl; } }; void printCarNumbers(Car *cars, int length) { for(int i = 0; i<length;i++) std::cout<<cars[i].printNo(); } int main() { int userInput = 10; Car *mycars = new Car[userInput]; for(int i =0;i < userInput;i++) mycars[i]=new Car[i+1]; printCarNumbers(mycars,userInput); return 0; }
Dieser Code zielt darauf ab, einen zu erstellen Array von Autos, aber beim Kompilieren tritt ein Fehler auf, der besagt, dass der Car()-Konstruktor privat ist. Die Frage ist: Kann die Initialisierung durchgeführt werden, ohne den Car()-Konstruktor öffentlich zu machen?
Lösung
Um dieses Problem zu beheben, kann Placement-New wie folgt verwendet werden :
class Car { int _no; public: Car(int no) : _no(no) { } }; int main() { void *raw_memory = operator new[](NUM_CARS * sizeof(Car)); Car *ptr = static_cast<Car *>(raw_memory); for (int i = 0; i < NUM_CARS; ++i) { new(&ptr[i]) Car(i); } // destruct in inverse order for (int i = NUM_CARS - 1; i >= 0; --i) { ptr[i].~Car(); } operator delete[](raw_memory); return 0; }
Placement-new ermöglicht die Zuweisung von Speicher und die Erstellung eines Objekts an einem bestimmten Ort. In diesem Fall wird „raw_memory“ zugewiesen und dann wird „placement-new“ verwendet, um Car-Objekte an den Adressen zu erstellen, auf die ptr zeigt.
Durch die Nutzung von „placement-new“ kann die Initialisierung des Arrays von Autos erreicht werden Respektierung der Privatsphäre des Car()-Konstruktors
Das obige ist der detaillierte Inhalt vonKann die Objektarray-Initialisierung ohne einen öffentlichen Standardkonstruktor erreicht werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!