[RESOLVIDO] Classe por Referencia

Pessoal, tenho que passar uma classe por referencia para outra classe. Mas acontecem alguns erros pois a classe fracao possui um construtor com atributos. O que fazer?

fracao.h

#ifndef FRACAO_H
#define FRACAO_H
class Fracao{
    private:
        int numerador;
        int denominador;
    public:
        Fracao(int numerador, int denominador);
        int getDenominador();
        int getNumerador();
};
#endif

fracao.cpp

#include <iostream>
#include "fracao.h"

Fracao::Fracao(int numerador, int denominador){
    Fracao::numerador = numerador;
    Fracao::denominador = denominador;
}

Fracao::getDenominador(){
    return Fracao::denominador;
}

Fracao::getNumerador(){
    return Fracao::numerador;
}

adicao.h

#ifndef ADICAO_H
#define ADICAO_H
#include <string>
#include "fracao.h"
using namespace std;
class Adicao{
    private:
        Fracao fracao1;
        Fracao fracao2;
        int denominadorFinal;
    public:
        Adicao(Fracao fracao1, Fracao fracao2);
        string resultado(int numerador1, int denominador1, int numerador2, int denominador2);
};
#endif

adicao.cpp

#include <iostream>
#include <sstream>
#include "adicao.h"
#include "fracao.h"
#include "mmc.h"

Adicao::Adicao(Fracao fracao1, Fracao fracao2){ // O erro acontece aqui
    Fracao Adicao::fracao1 = &fracao1;
    Fracao Adicao::fracao2 = &fracao2;
    int Adicao::denominadorFinal = MMC.calcularDenominadorFinal(Adicao::fracao1.getDenominador(), Adicao::fracao2.getDenominador());
}

string Adicao::resultado(int numerador1, int denominador1, int numerador2, int denominador2){
    string resultado;
    int resultado1, resultado2;
    if(denominador1 == denominador2){
        int soma = numerador1+numerador2;
        stringstream ssoma;
        ssoma << soma;
        stringstream sdenominador;
        sdenominador << Adicao::denominadorFinal;
        resultado = ssoma.str()+"/"+sdenominador.str();
    }else{
        resultado1 = (Adicao::denominadorFinal/denominador1)*numerador1;
        resultado2 = (Adicao::denominadorFinal/denominador2)*numerador2;
        int soma = resultado1+resultado2;
        stringstream ssoma;
        ssoma << soma;
        stringstream sdenominador;
        sdenominador << Adicao::denominadorFinal;
        resultado = ssoma.str()+"/"+sdenominador.str();
    }
    return resultado;
}

Vi algumas falhas no seu código. Primeiro, não use SuaClasse::suaVariavel para acessar variáveis não estáticas.

Segundo, sempre que quiser usar um constructor para inicializar variáveis de instancia, utilize initialization list. No caso, a definição da classe Fracao ficaria assim:


Fracao::Fracao(int num, int den):
 numerador(num), denominador(den) /* << initialization list */
    { /* o corpo do constructor pode ficar vazio */ }

int Fracao::getDenominador(){
    return denominador; /* <<< sem o Fracao:: */
}

int Fracao::getNumerador(){
    return numerador; /* <<< sem o Fracao:: */
}

Seguindo a lógica, o constructor da classe Adicao também pode ser corrigido

Adicao::Adicao(Fracao f1, Fracao f2): fracao1(f1), fracao2(f2) {  }

E assim o erro que mencionou sumirá.

Concertei tudo mas apareceu outro erro no arquivo adicao.cpp:

int Adicao::denominadorFinal = MMC.calcularDenominadorFinal(Adicao::fracao1.getDenominador(), Adicao::fracao2.getDenominador()); // Linha do erro

É por causa desse tal de MMC, né? Eu achei que vc tinha definido ele em outro lugar e acabou esquecendo de colocar o código.

mmc.h

#ifndef MMC_H
#define MMC_H

class MMC{
    private:
        int denominadorFinal(int denominador1, int denominador2);
        int denominador(int denominador, int i);
    public:
        int calcularDenominadorFinal(int denominador1, int denominador2);
};

#endif

mmc.cpp

#include <iostream>
#include "mmc.h"

int MMC::calcularDenominadorFinal(int denominador1, int denominador2){
    int denominador = 1;
    if(denominador1 == denominador2){
        denominador = denominador2;
    }else{
        denominador = MMC::denominadorFinal(denominador1, denominador2);
    }
    return denominador;
}

int MMC::denominadorFinal(int denominador1, int denominador2){
    int denominador = 1;
    for(int i = 2;((denominador1 > 1) || (denominador2 >> 1));i++){
        while(((denominador1 % i) == 0) || ((denominador2 % i) == 0)){
            denominador1 = MMC::denominador(denominador1, i);
            denominador2 = MMC::denominador(denominador2, i);
            denominador = denominador*i;
        }
    }
    return denominador;
}

int MMC::denominador(int denominador, int i){
    if((denominador % i) == 0){
        denominador = denominador/i;
    }
    return denominador;
}

A seguinte expressão só seria válida se calcularDenominadorFinal() fosse uma função estática.

MMC.calcularDenominadorFinal(Adicao::fracao1.getDenominador(), Adicao::fracao2.getDenominador());

Como não é estática, vc teria que criar um objeto do tipo MMC primeiro. Algo como:

Adicao::Adicao(Fracao f1, Fracao f2): fracao1(f1), fracao2(f2){
    MMC mmc;
    denominadorFinal = mmc.calcularDenominadorFinal(fracao1.getDenominador(), fracao2.getDenominador());
}