Initialisation du tableau d'objets sans constructeur par défaut
Considérez le code suivant :
#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; }
Ce code vise à créer un tableau de voitures, mais une fois compilé, il rencontre une erreur indiquant que le constructeur Car() est privé. La question est : l'initialisation peut-elle être effectuée sans rendre public le constructeur Car() ?
Solution
Pour résoudre ce problème, placement-new peut être utilisé comme suit :
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 permet d'allouer de la mémoire et de construire un objet à un emplacement spécifique. Dans ce cas, raw_memory est alloué, puis placement-new est utilisé pour construire des objets Car aux adresses pointées par ptr.
En tirant parti du placement-new, l'initialisation du tableau de voitures peut être réalisée tout en en respectant la confidentialité du constructeur Car()
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!