我正在对运算符重载进行一些探索,同时重新阅读我的一些旧大学教科书,我认为我误解了一些东西,所以希望这对一些回答者来说是一个很好的简单声誉。如果这是重复的,请指出我正确的方向。

我创建了一个简单的计数器类,它有(在这个阶段)一个成员,val(一个 int)。

我已经初始化了三个这样的计数器,varOne 到 varThree,并希望第三个计数器是前两个的总和(例如 varThree.val 在下面的代码中设置为 5)

counter::counter(int initialVal)
{
    val = initialVal;
    //pVal = new int;
    //*pVal = 10; // an arbitrary number for now
}

int main (int argc, char const* argv[])
{
    counter varOne(3), varTwo(2), varThree;
    varThree = varOne + varTwo;

    return 0;
}

我已经像这样重载了 operator+:
counter operator+(counter& lhs, counter& rhs)
{
    counter temp(lhs.val + rhs.val);
    return temp;
}

我已经把它变成了一个非成员函数,并且是 counter 类的一个 friend ,以便它可以访问私有(private)值。

我的问题开始于添加另一个私有(private)成员 pVal (指向 int 的指针)。添加这意味着我不能再进行简单的 varThree = varOne 复制,因为当 varOne 被销毁时,varThree.pVal 仍将指向同一位内存。

我按如下方式重载了 operator=
int counter::getN()
{
    return *newVal;
}

counter& counter::operator=(counter &rhs)
{
    if (this == &rhs) return *this;
    val = rhs.val;
    delete pVal;
    pVal = new int;
    *pVal = rhs.getN();
    return *this;
}

现在,如果我执行类似 varThree = varOne 的操作,所有内容都会正确复制,但是尝试执行 varThree = varOne + varTwo 会出现以下错误:
counter.cpp: In function ‘int main(int, const char**)’:
counter.cpp:96: error: no match for ‘operator=’ in ‘varThree = operator+(counter&, counter&)(((counter&)(& varTwo)))’
counter.cpp:55: note: candidates are: counter& counter::operator=(counter&)
make: *** [counter] Error 1

看起来 counter::operator= 无法处理 operator+ 的返回输出,我需要进一步重载 operator= 以接受 operator+ 返回的类型,但我没有运气,我开始认为也许我做了一些根本错误的事情。

最佳答案

您需要将参数作为常量引用传递。例如:

counter& counter::operator=( const counter &rhs )

运算符+() 也类似。这是必要的,以便能够将临时值绑定(bind)到函数参数。当您按值返回时会创建临时值,因此当您说:
varOne + varTwo

创建了一个无名的临时对象。这是正确的做法,但您必须通过将其参数设置为常量来确保诸如赋值操作之类的函数可以接受此类值。

您还需要为您的类实现复制构造函数和析构函数,尽管缺少这些不会导致编译错误(不幸的是)。

关于c++重载运算符,赋值,深复制和加法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/961943/

10-13 06:45