Maison > développement back-end > C++ > L'initialisation d'un tableau d'objets peut-elle être réalisée sans constructeur public par défaut ?

L'initialisation d'un tableau d'objets peut-elle être réalisée sans constructeur public par défaut ?

Patricia Arquette
Libérer: 2024-12-20 09:41:10
original
200 Les gens l'ont consulté

Can Object Array Initialization Be Achieved Without a Public Default Constructor?

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

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

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!

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