Перегрузка C ++ (я возражаю + class), (я возражаю + int), (int + я возражаю)

Для упражнения я нуждаюсь в том, чтобы реализовать операции между int и класс, который я определил (Рационально)

int main(){
    Racional *r1 = new Racional(1,2);
    Racional *r2 = new Racional(2,3);
    Racional *r;
    // y debo poder hacer las siguientes operaciones:
    r = *r1 + *r2;
    r = *r1 + 52;
    r = *10 + *r2;
}

Осуществите класс следующего способа и он дает мне ошибку 'многообразный definition of operator+(Racional&, Racional&)'

class Racional{
private:
    int numerador;
    int denominador;
public:
    Racional* suma(Racional *);
    // y otras funciones...
};

Racional* operator +(Racional &r1, Racional &r2){
    return r1.suma(&r2); 
}
Racional* operator +(Racional r1, int i){
    Racional *r2 = new Racional(i);
    Racional *ret = r1.suma(r2);
    delete r2;
    return ret;
}
Racional* operator +(int i,Racional r1){
    Racional *r2 = new Racional(i);
    Racional *ret = r1.suma(r2);
    delete r2;
    return ret;
}

Как он был бы должен делать, чтобы мочь делать операции? Большое спасибо

1
задан 29.03.2019, 02:07
1 ответ

Ты идешь из-за хорошей дорожки, так как ты понимаешь два типа перегрузок:

  1. Перегружает как método класса , когда оператора один método самого класса:

    struct Ejemplo {
        Ejemplo operator+(int);
    };
    

    В этом случае, классе всегда estarÃ: левая сторона оператора и tipo_t в правую сторону:

    Ejemplo e;
    Ejemplo a = e + 1; // Correcto
    Ejemplo b = 1 + e; // ERROR!!!
    
  2. Перегружает, как funci¦n я освободил , когда оператор - свободный funci¦n:

    struct Ejemplo {
        Ejemplo operator+(int);
    };
    
    Ejemplo operator+(int, Ejemplo);
    

    В этом случае ты можешь выбирать типы в левую сторону и правую сторону оператора:

    Ejemplo e;
    Ejemplo a = e + 1; // Correcto, llama a Ejemplo Ejemplo::operator+(int);
    Ejemplo b = 1 + e; // Correcto, llama a Ejemplo operator+(int, Ejemplo);
    

того, что ты не понимаешь, состоит в том, что НЕ ты должен использовать указатели ни для чего из того, что ты нуждаешься в том, чтобы сделать: Предложенные

:

Способствуй тому, чтобы все операторы были свободными функциями

class Racional {
    friend Racional operator+(const Racional &, const Racional &);
    friend Racional operator+(int, const Racional &);
    friend Racional operator+(const Racional &, int);
};

int main(){
    Racional r1 = Racional(1,2);
    Racional r2 = Racional(2,3);
    Racional r;

    // y debo poder hacer las siguientes operaciones:
    r = r1 + r2; // Primer caso, Racional + Racional
    r = r1 + 52; // Segundo caso, Racional + int
    r = 10 + r2; // Tercer caso, int + Racional
}

Racional operator+(const Racional &, const Racional &) {
    // Código primer caso
}
Racional operator+(int, const Racional &) {
    // Código segundo caso
}
Racional operator+(const Racional &, int) {
    // Código tercer caso
}

Ввиду того, что Racional - класс, для того, чтобы операторы имели доступ к данным о классе, deberÃ: n быть подругами функциями класса.

2
ответ дан 19.11.2019, 21:19

Теги

Похожие вопросы