Initialisation de tableaux d'objets sans constructeur par défaut
Les tableaux d'objets sont couramment utilisés en programmation, mais des problèmes peuvent survenir lors de leur initialisation avec des classes dépourvues de constructeurs par défaut . Considérez le code suivant :
class Car { private: Car(){}; // Private default constructor int _no; public: Car(int no) { _no = no; } };
Au sein de cette classe, le constructeur par défaut (Car()) est privé, ce qui signifie que les objets de type Car ne peuvent pas être créés sans fournir d'arguments. Cependant, lors de l'initialisation d'un tableau d'objets Car, le compilateur tente d'appeler le constructeur par défaut pour chaque élément, ce qui entraîne l'erreur :
cartest.cpp:5: error: ‘Car::Car()’ is private cartest.cpp:21: error: within this context
Solution utilisant Placement-New
Pour surmonter ce problème, un nouveau placement peut être utilisé. Placement-new nous permet d'allouer de la mémoire et de construire des objets directement dans cet emplacement mémoire sans invoquer le constructeur de l'objet. Voici comment cela peut être implémenté :
int main() { void *raw_memory = operator new[](NUM_CARS * sizeof(Car)); // Allocate raw memory Car *ptr = static_cast<Car *>(raw_memory); // Cast to a pointer to Car for (int i = 0; i < NUM_CARS; ++i) { new(&ptr[i]) Car(i); // Call placement-new to construct Car objects in-place } }
En utilisant placement-new, nous pouvons initialiser le tableau d'objets sans appeler explicitement le constructeur par défaut. Les objets sont créés et placés directement dans la mémoire allouée.
Avantages d'éviter les constructeurs par défaut
Comme mentionné dans l'article 4 du "More Effective C" de Scott Meyers, éviter les constructeurs par défaut gratuits peut améliorer l'exactitude et la maintenabilité du programme. Les constructeurs par défaut conduisent souvent à une ambiguïté dans la conception des classes et peuvent rendre difficile l'application des invariants de classe. En définissant explicitement les constructeurs, le programmeur affirme que les objets de cette classe ne peuvent être créés qu'avec des ensembles d'arguments spécifiques, garantissant ainsi un plus grand contrôle et une plus grande clarté.
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!