C++ 如何在类构造函数中初始化存储对象指针的模板数组容器
问题前置修正:Array模板类适配改造
你当前提供的Array模板所有元素相关逻辑都硬编码为int类型,无法支持存储P*类型数据,需要先做如下修改:
// 修改后的Array.h核心代码 using namespace std; template <typename T> class Array { public: Array(); ~Array(); void add(T t); // 原参数int改为T T get(int index); // 原返回值int改为T,补充实现 int getSize(); bool isFull(); T& operator[] (int); // 原返回值int&改为T& private: int size; T* elements; // 原int*改为T* static const int MAX_ARR = 256; // 补充const修饰,支持类内初始化 }; template <typename T> Array<T>::Array(){ elements = new T[MAX_ARR]; size = 0; } template <typename T> Array<T>::~Array(){ delete [] elements; } template <typename T> void Array<T>::add(T t){ if (size >= MAX_ARR) return; elements[size++] = t; } template <typename T> T Array<T>::get(int index){ if (index < 0 || index >= size) { cerr<<"Array index out of bounds"<<endl; exit(0); } return elements[index]; } template <typename T> int Array<T>::getSize(){ return size; } template <typename T> bool Array<T>::isFull(){ return size >= MAX_ARR; } template <typename T> T& Array<T>::operator[](int index){ if (index < 0 || index >= size) { cerr<<"Array index out of bounds"<<endl; exit(0); } return elements[index]; }
构造函数初始化方案
情况1:ps是A类的局部变量
默认构造函数会直接初始化空容器,不需要额外赋值,问号处可以直接留空或者写Array<P*>():
A::A(){ Array<P*> ps; // 直接完成空容器初始化 // 后续可添加P类对象指针 ps.add(new P("自定义名称1")); ps.add(new P("自定义名称2")); }
情况2:ps是A类的成员变量
不要在构造函数内重复定义局部变量,直接在构造函数的初始化列表中初始化,或者构造函数内直接操作:
// A.h中类A的声明里添加成员变量 class A { public: A(); ~A(); // 补充析构函数释放P对象内存,避免泄漏 private: Array<P*> ps; }; // A.cpp构造函数实现 A::A() : ps() { // 初始化列表调用默认构造,也可以省略,编译器会自动调用 ps.add(new P("自定义名称1")); } // 析构函数补充内存释放逻辑 A::~A() { for(int i=0; i<ps.getSize(); i++) { delete ps.get(i); } }
注意事项
当前实现用裸指针存储P对象,需要手动管理内存避免泄漏,建议替换为std::unique_ptr<P>或者std::shared_ptr<P>自动管理生命周期。
内容的提问来源于stack exchange,提问作者querying_questioner
相关产品推荐
相关产品推荐

