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; } };
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
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(&ptr[i]) Car(i); // Call placement-new to construct Car objects in-place } }
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!