Maison > développement back-end > C++ > Comment initialiser des tableaux d'objets sans constructeur par défaut ?

Comment initialiser des tableaux d'objets sans constructeur par défaut ?

Mary-Kate Olsen
Libérer: 2024-12-27 06:15:12
original
782 Les gens l'ont consulté

How to Initialize Object Arrays Without a Default Constructor?

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;
  }
};
Copier après la connexion

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
Copier après la connexion

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(&amp;ptr[i]) Car(i);  // Call placement-new to construct Car objects in-place
  }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal