不带默认构造函数的对象数组初始化
考虑以下代码:
#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中文网其他相关文章!