You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 18:36:07