недопустимые операнды типов - c ++ - PullRequest
2 голосов
/ 13 сентября 2011

У меня есть класс с именем ThreeDigits в коде c ++.Я перегрузил операнд + следующим образом:

ThreeDigits* ThreeDigits::operator+(const ThreeDigits &number) const

{
   double result= getNumber()+number.getNumber();
   ThreeDigits* new_result=new ThreeDigits(result);
   return new_result;
}

, но когда я пишу в основную функцию:

    ThreeDigits* first=new ThreeDigits(2.55998);
    ThreeDigits* second=new ThreeDigits(5.666542);
    ThreeDigits* result=first+second;

, я получаю следующую ошибку компиляции: недопустимые операнды типов ThreeDigits * иThreeDigits * to бинарный оператор +

Можете ли вы сказать мне, в чем проблема?спасибо

Ответы [ 4 ]

12 голосов
/ 13 сентября 2011

Вы пытаетесь суммировать указатели на объекты вместо самих объектов. Чтобы вызвать перегруженный оператор, вы должны вызывать его для объектов, разыменовывая указатели.

Кстати, создание всех этих объектов с new - ужасный способ сделать C ++; в C ++, в отличие от Java / C #, вы должны использовать new только тогда, когда вам нужно, и размещать все остальное в стеке. operator+ возвращение указателя на вновь созданный объект является мерзостью.

Способ написания кода на C ++:

ThreeDigits ThreeDigits::operator+(const ThreeDigits &number) const
{
   return ThreeDigits(getNumber()+number.getNumber()); // construct a temporary and return it
}

// ...

ThreeDigits first(2.55998);
ThreeDigits second(5.666542);
ThreeDigits result=first+second;

Кстати, обычным способом перегрузки арифметических операторов является сначала перегрузка присваивающих версий (+ =, - =, ...), а затем построение над ними «нормальной» версии. Подробнее о перегрузке операторов см. В разделе часто задаваемых вопросов о перегрузке операторов .

3 голосов
/ 13 сентября 2011

Чтобы использовать ваш оператор в том виде, в котором он написан, вам нужно написать: ThreeDigits* result=*first+*second;, чтобы разыменовать указатели.

Однако у вашего оператора есть как минимум две проблемы: во-первых, он нарушает принципНаименьшее удивление в этом канонически operator+ возвращает по значению.Во-вторых, он возвращает указатель на новую память, которая, скорее всего, будет просачиваться в самых разных случаях, если не соблюдать меры предосторожности.

Похоже, вы можете прийти из Java-фона, где все подсчитано.Вместо этого идиоматическая реализация C ++ будет выглядеть так:

ThreeDigits ThreeDigits::operator+(const ThreeDigits &number) const
{
   double result= getNumber()+number.getNumber();
   return ThreeDigits(result);
}

И используется:

ThreeDigits first(2.55998);
ThreeDigits second(5.666542);
ThreeDigits result = first+second;
1 голос
/ 13 сентября 2011

Ваш оператор принимает две ссылки ThreeDigits и возвращает указатель ThreeDigits.

Чтобы использовать ваш оператор в том виде, в котором он написан, вы должны разыменовать first и second:

ThreeDigits* result = *first + *second;

У этого оператора необычная подпись. operator+ должен возвращать ThreeDigits (т.е. не указатель на единицу). Для вашего оператора крайне неуместно вводить новые (или malloc) данные, потому что пользователи этого не ожидают. RVO означает, что возвращение копии не так уж важно.

1 голос
/ 13 сентября 2011

Вы не разыменовываете указатели. Попробуйте это:

ThreeDigits* result = *first + *second;
...