我正在重新阅读我的一些旧大学教科书时正在对运算符重载进行一些探索,我认为我误解了一些东西,所以希望这对一些回答者来说是一个不错的轻松声誉。如果这是重复的,请指出我正确的方向。
我创建了一个简单的计数器类,它(在这个阶段)有一个成员,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 类的一个朋友,这样它就可以访问私有值。
当添加另一个私有成员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+
返回的类型,但是我没有运气,我开始认为也许我已经做了一些事情根本错误。