Heim >Backend-Entwicklung >C++ >Kann die Objektarray-Initialisierung ohne einen öffentlichen Standardkonstruktor erreicht werden?

Kann die Objektarray-Initialisierung ohne einen öffentlichen Standardkonstruktor erreicht werden?

Patricia Arquette
Patricia ArquetteOriginal
2024-12-20 09:41:10205Durchsuche

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

Objektarray-Initialisierung ohne Standardkonstruktor

Beachten Sie den folgenden Code:

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

Dieser Code zielt darauf ab, einen zu erstellen Array von Autos, aber beim Kompilieren tritt ein Fehler auf, der besagt, dass der Car()-Konstruktor privat ist. Die Frage ist: Kann die Initialisierung durchgeführt werden, ohne den Car()-Konstruktor öffentlich zu machen?

Lösung

Um dieses Problem zu beheben, kann Placement-New wie folgt verwendet werden :

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

Placement-new ermöglicht die Zuweisung von Speicher und die Erstellung eines Objekts an einem bestimmten Ort. In diesem Fall wird „raw_memory“ zugewiesen und dann wird „placement-new“ verwendet, um Car-Objekte an den Adressen zu erstellen, auf die ptr zeigt.

Durch die Nutzung von „placement-new“ kann die Initialisierung des Arrays von Autos erreicht werden Respektierung der Privatsphäre des Car()-Konstruktors

Das obige ist der detaillierte Inhalt vonKann die Objektarray-Initialisierung ohne einen öffentlichen Standardkonstruktor erreicht werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn