2014-01-29 2 views
1

У меня есть такое определение класса:Как вернуть первый операнд, если второй операнд + перегрузки оператора равен нулю в C++?

class foo{ 

public: 
    foo(); 
    foo(const int& var); 
    foo(const foo& var); 
    ~foo(); 

    const foo operator +(const foo& secondOp) const; 

private: 
    int a; 
    //plus other values, pointers, e.t.c. 

}; 

Кроме того, я сделал эту реализацию для '+' перегрузкой операторов:

const foo foo::operator +(const foo& secondOp) const{ 

    //I want here to check if i have one operand or two... 
    if ((FIRST_OPERAND.a!=0) && (secondOp.a==0)){ 
     cout << "ERROR, second operand is zero"; 
     return FIRST_OPERAND; 
    } 
    else if ((FIRST_OPERAND.a==0) && (secondOp.a!=0)){ 
     cout << "ERROR, first operand is zero"; 
     return secondOp; 
    } 

} 

Когда я пишу в main():

foo a(2); 
foo b; 
foo c; 

//I want here to print the ERROR and 
//return only the values of a 
c = a + b; 
  1. Ηow может i return значение первого операнда, если второй операнд равен нулю, а vic и наоборот?
+1

Имейте 'operator +' возвращать объект некоторого произвольного типа с соответствующей информацией и перегружать 'operator =' только для этого типа. – 0x499602D2

+4

Если второй операнд отсутствует, ваш код будет выглядеть примерно так: 'c = a +;', правильно? Это просто не будет компилироваться. –

+0

Можете ли вы уточнить? С примером кода? @ 0x499602D2 – MinimalTech

ответ

2

Вы почти у цели. Поскольку это функция-член, первый операнд *this, поэтому замените FIRST_OPERAND.a на this->a или просто a.

Однако, возможно, было бы лучше сделать его функцией, не являющейся членом, чтобы разрешить преобразование обоих операндов (то есть иметь возможность писать a + 2 или 2 + a). Для доступа к частному члену (ей) он должен быть другом.

friend foo operator +(const foo& firstOp, const foo& secondOp); 

Кроме того, лучше не возвращать значение const как предотвращает переход от возвращаемого значения.

0

Это компилятор, который проверяет синтаксическую правильность программы. Он не в состоянии различить, действительно ли вы хотите написать

c = a; 

, который должен выполнить задание или вы хотите написать

c = a + b; 

оба утверждения верны.

Это так называемая логическая ошибка. Компилятор не может понять, что мы делаем.

+0

Благодарим за помощь, я задал неправильный вопрос ... – MinimalTech

0

Для вашей линии c = a; Оператор присваивания реализуется компилятором (только мелкое копирование памяти объекта). Именно поэтому ваш код компилируется «без второго операнда».

Если вы хотите запретить использование оператора присваивания - спрячьте его. Например. путем реализации с модификатором доступа private.

+0

Спасибо за помощь, я задал неправильный вопрос ... – MinimalTech

Смежные вопросы