C ++重载加号运算符以将元素添加到对象

C++ Overloading the plus operator to add an element to an object

对象的构造函数

Set<T>::Set() {
    buckets = new forward_list<T>[9];
    numBuck = 9;
    numElem = 0;
    maxLoad = 9;
}

加号运算符重载

Set<T>::operator+(T elem){
    Set<T> res;
    return res;
}

我不知道从哪里开始。此重载运算符将其参数 elem 添加到 *this 的副本,并 return 结果。 例如:

Set<char>setA;
Set<char>setB;

setA.Add('a')
setA.Add('b')
setA.Add('c')
// setA contains {'a','b','c'}
setB = setA + 'd'
// setB should now contain {'a','b','c','d'}

有指导吗?

编辑:阐明运算符重载功能

对于*this的拷贝,可以修改res的定义,使用拷贝构造函数

Set<T> res(*this);

添加 elem 参数使用与向 setA 添加元素相同的方法。

res.Add(elem);

因为看起来您的代码正在管理一个指针,您将需要定义自己的析构函数,以释放分配的内存。

Set<T>::~Set() {
    delete[] buckets;
}

由于三规则,您也有义务实现自己的复制构造函数和赋值运算符。您的复制构造函数需要执行自己的分配,并且需要复制另一个 Set 中的元素。

Set<T>::Set(const Set<T> &other) {
    numBuck = other.numBuck;
    numElem = other.numElem;
    maxLoad = other.maxLoad;
    buckets = new forwardList<T>[numBuck];
    // ... add code to copy elements from other.buckets
}

赋值运算符可以使用复制交换惯用法来实现。

Set<T> & Set<T>::operator = (Set<T> other) {
    using std::swap;
    swap(*this, other);
    return *this;
}

为避免需要实现您自己的析构函数/复制构造函数/赋值运算符方法,您可以选择用 vector 表示您的 buckets 而不是管理您自己的指针。

    std::vector<forward_list<T>> buckets;

你可以只在集合中创建一个复制函数,并在重载中使用Add函数。演示代码:

Set<T>::operator+(T elem)
{
    Set<T> result;
    result.Copy(*this);
    result.Add(elem);
    return result;
}

注意:或者您可以按照@jxh 的回答并使用默认的复制构造函数。为了明确起见,我会制作一个 Copy 函数。 :)