Heim > Backend-Entwicklung > C++ > Wie initialisiere ich Objektarrays ohne einen Standardkonstruktor?

Wie initialisiere ich Objektarrays ohne einen Standardkonstruktor?

Mary-Kate Olsen
Freigeben: 2024-12-27 06:15:12
Original
785 Leute haben es durchsucht

How to Initialize Object Arrays Without a Default Constructor?

Objektarrays ohne Standardkonstruktor initialisieren

Objektarrays werden häufig in der Programmierung verwendet, es können jedoch Probleme auftreten, wenn sie mit Klassen initialisiert werden, denen Standardkonstruktoren fehlen . Betrachten Sie den folgenden Code:

class Car {
private:
  Car(){};  // Private default constructor
  int _no;
public:
  Car(int no) {
    _no = no;
  }
};
Nach dem Login kopieren

Innerhalb dieser Klasse ist der Standardkonstruktor (Car()) privat, was bedeutet, dass Objekte vom Typ Car nicht ohne Angabe von Argumenten erstellt werden können. Beim Initialisieren eines Arrays von Car-Objekten versucht der Compiler jedoch, den Standardkonstruktor für jedes Element aufzurufen, was zu folgendem Fehler führt:

cartest.cpp:5: error: ‘Car::Car()’ is private
cartest.cpp:21: error: within this context
Nach dem Login kopieren

Lösung mit Placement-New

Um dieses Problem zu lösen, kann Placement-New eingesetzt werden. Placement-new ermöglicht es uns, Speicher zuzuweisen und Objekte direkt an diesem Speicherort zu erstellen, ohne den Konstruktor des Objekts aufzurufen. So kann es implementiert werden:

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
  }
}
Nach dem Login kopieren

Durch die Verwendung von „placement-new“ können wir das Objektarray initialisieren, ohne den Standardkonstruktor explizit aufzurufen. Die Objekte werden erstellt und direkt im zugewiesenen Speicher abgelegt.

Vorteile der Vermeidung von Standardkonstruktoren

Wie in Punkt 4 von Scott Meyers „More Effective C“ erwähnt, Die Vermeidung unnötiger Standardkonstruktoren kann die Korrektheit und Wartbarkeit des Programms verbessern. Standardkonstruktoren führen häufig zu Unklarheiten im Klassendesign und können die Durchsetzung von Klasseninvarianten erschweren. Durch die explizite Definition von Konstruktoren stellt der Programmierer sicher, dass Objekte dieser Klasse nur mit bestimmten Argumentsätzen erstellt werden können, was eine größere Kontrolle und Klarheit gewährleistet.

Das obige ist der detaillierte Inhalt vonWie initialisiere ich Objektarrays ohne einen Standardkonstruktor?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage