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
Mary-Kate Olsenoriginal
2024-12-27 06:15:12833parcourir

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;
  }
};

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(&amp;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!

Déclaration:
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