不帶預設建構子的物件陣列初始化
考慮以下程式碼:
#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; }
此程式碼旨在旨在建立一個汽車數組,但編譯時遇到錯誤,指出Car() 建構子是私有的。問題是,可以在不公開 Car() 建構函數的情況下執行初始化嗎?
解
為了解決這個問題,可以使用placement-new,如下所示:
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(&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 允許在特定位置分配記憶體並建構物件。在這種情況下,會指派raw_memory,然後使用placement-new在ptr指向的位址建構Car物件。
利用placement-new,可以實現汽車陣列的初始化,同時尊重 Car() 建構函數的隱私
以上是沒有公共預設構造函數可以實現物件數組初始化嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!