如何调用带参非默认构造函数构造C++类对象数组?
这个问题我之前也碰到过!因为你用new hi[number_of_instance]的时候,编译器会尝试调用hi的默认构造函数,但你的类只定义了带两个int参数的构造函数,所以肯定会编译失败。下面给你几种可行的解决办法:
方法1:C++11及以后用初始化列表(固定数量场景)
如果你的实例数量是固定的编译期常量,或者能提前知道每个实例的参数,可以直接用初始化列表初始化数组:
class hi { public: hi(int a, int b){}; }; int main() { hi *hello = new hi[3]{{1, 2}, {3, 4}, {5, 6}}; // 记得用完后释放内存 delete[] hello; }
不过要注意,这种方式不适用于number_of_instance是运行时变量的情况,因为初始化列表的长度必须是编译期确定的。
方法2:用std::vector(推荐,支持动态数量)
这是更灵活也更安全的方案,std::vector可以轻松处理动态数量的对象,并且直接调用你的自定义构造函数:
#include <vector> class hi { public: hi(int a, int b){}; }; int main() { int number_of_instance = 5; std::vector<hi> hello; hello.reserve(number_of_instance); // 提前分配内存,提升效率 // 循环创建对象,这里用i和i+1做示例,你可以换成实际需要的参数 for(int i = 0; i < number_of_instance; ++i) { hello.emplace_back(i, i+1); } // vector会自动管理内存,不需要手动delete }
emplace_back会直接在vector的内存空间里构造hi对象,完美适配你的双参数构造函数,而且不需要手动管理内存,非常省心。
方法3:C++11之前的手动内存管理(仅作兼容参考)
如果你的项目必须兼容C++11之前的标准,可以先分配原始内存,再用placement new逐个构造对象,最后还要手动析构每个对象并释放内存:
#include <cstdlib> class hi { public: hi(int a, int b){}; ~hi(){}; // 确保类有析构函数 }; int main() { int number_of_instance = 5; // 先分配足够的原始内存 hi* hello = static_cast<hi*>(malloc(sizeof(hi) * number_of_instance)); // 逐个调用构造函数创建对象 for(int i = 0; i < number_of_instance; ++i) { new(&hello[i]) hi(i, i+1); // placement new 直接在已分配内存中构造对象 } // 使用对象... // 必须逐个手动析构对象 for(int i = 0; i < number_of_instance; ++i) { hello[i].~hi(); } // 释放原始内存 free(hello); }
这种方式需要手动处理构造、析构和内存释放,很容易出错,所以除非万不得已,优先用std::vector方案。
内容的提问来源于stack exchange,提问作者Zeeshan Hayat
相关产品推荐
相关产品推荐

