C++重载加号运算符实现向Set对象添加元素的问题咨询
C++ Set模板类加号运算符重载实现指导
前提准备
你的Set类内部使用了动态分配的forward_list数组存储数据,必须先实现正确的拷贝构造函数,避免浅拷贝导致的内存泄漏、重复释放问题,同时需要配套实现析构函数释放动态内存:
// 拷贝构造函数实现 template<typename T> Set<T>::Set(const Set<T>& other) { // 复制基础配置成员 numBuck = other.numBuck; numElem = other.numElem; maxLoad = other.maxLoad; // 申请独立的桶数组 buckets = new forward_list<T>[numBuck]; // 逐个复制每个桶内的元素 for (int i = 0; i < numBuck; ++i) { buckets[i] = other.buckets[i]; } } // 析构函数实现 template<typename T> Set<T>::~Set() { delete[] buckets; }
加号运算符重载完整实现
首先需要修正函数签名:加号运算不会修改原操作数,所以要给成员函数加const限定,参数用const引用减少不必要的拷贝,返回值明确为Set<T>类型:
template<typename T> Set<T> Set<T>::operator+(const T& elem) const { // 拷贝当前对象的所有元素和配置到新对象 Set<T> res(*this); // 调用已有的Add方法将目标元素添加到新对象中 res.Add(elem); // 返回包含原有元素+新元素的新对象 return res; }
逻辑说明
你原有未完成代码的问题是直接默认构造了空的res对象,没有复制原Set的内容,所以返回的新对象永远只有新添加的元素,没有原有数据。该实现通过拷贝构造完整复用原对象的所有数据,且全程不修改原*this对象,完全符合你要求的运算符语义。
如果你的Set支持自动扩容(元素数量超过maxLoad时重新分配桶),Add方法里的扩容逻辑会自动在新对象res上触发,不需要额外处理。
内容的提问来源于stack exchange,提问作者Zayum
相关产品推荐
相关产品推荐

