В данный момент я изучаю перегрузку операторов, перечитывая некоторые из моих старых университетских учебников, и думаю, что что-то неправильно понимаю, так что, надеюсь, для некоторых это будет хорошей легкой репутацией. . отвечающие Если это дубликат, укажите мне правильное направление.
Я создал простой класс счетчика, который имеет (на данном этапе) один член, val (int).
Я инициализировал три из этих счетчиков, varOne to 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;
}
Я перегружен оператор + вот так:
counter operator+(counter& lhs, counter& rhs)
{
counter temp(lhs.val + rhs.val);
return temp;
}
Я сделал эту функцию не-членом и другом класса счетчика, чтобы он мог получить доступ к закрытым значениям.
Моя проблема начинается при добавлении другого закрытого члена, 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+
, но у меня не было удачи, и я начинаю думать, что, возможно, я сделал что-то в корне неправильно.