Ajuda C++

monkeypuke

Power Member
Boas, o meu problema é o seguinte:
Tenho de fazer um trabalho em que exite um paralelipipedo e duas esferas.
Umas das esfera está colocada no interior do paralelipipedo e a outra fora dele.
O objectivo é calcular a àrea do paralelipipedo e subtrair-lhe a àrea da esfera que está no interior.
No fim, soma-se a àrea da esfera que está no exterior para obter a área total.
Temos de pedir todos os valores ao utilizador no "main()".
O meu problema é que temos de utilizar uma cena chamada "sobrecarga de operadores" (que eu pouco ou quase nada) e criar as classes esfera e paralelipipedo.

Para poder ser mais fácil de explicar deixo a página do caderno com as coisas que o professor escreveu no quadro.
http://www.box.net/shared/m6pn1knhy2

Obrigado pela atenção.
 
Classes:

class Csphere {
int r;
public:
void set_values (int);
int volume () {return ((4/3)*3.1415*(r*r*r));}
};

class Cparalelipipedo {
int x, y, h;
public:
void set_values (int,int,int);
int volume () {return (x*y*h);}
};
 
Esta no caminho certo. Tenta agora criar um classe abstracta que implementa o método virtual volume (ou mais correctamente get_volume), e faz com que as classes que crias-te herdem o a nova classe abstracta.
 
Esta no caminho certo. Tenta agora criar um classe abstracta que implementa o método virtual volume (ou mais correctamente get_volume), e faz com que as classes que crias-te herdem o a nova classe abstracta.

Código:
//definir valores
void Csphere::set_values (int a) {
  r = a;
}

void Cparalelipipedo::set_values (int a,int b,int c) {
  x = a;
  y = b;
  h = c;
}


main()
{
 int tmp; int tmp1; int tmp2;
 //criar objectos
 Csphere sphereout;
 Csphere spherein;
 Cparalelipipedo paral;
 
 //pedir valores da esfera de fora
 cout << "Insira o valor do raio de esfera que está fora do paralelipipedo";
 cin >> tmp;
 sphereout.set_values (tmp);
     //cout << "volume: " << sphereout.volume();

 //pedir valores da esfera de dentro
 cout << "Insira o valor do raio de esfera que está dentro do paralelipipedo";
 cin >> tmp;
 spherein.set_values (tmp);
     //cout << "volume: " << spherein.volume();

 //pedir valores do paralelipipedo 
 cout << "Insira o valor do comprimento do paralelipipedo";
 cin >> tmp;
 cout << "Insira o valor da largura do paralelipipedo";
 cin >> tmp1;
 cout << "Insira o valor da altura do paralelipipedo";
 cin >> tmp2;
 paral.set_values (tmp,tmp1,tmp2);
     //cout << "volume: " << paral.volume();
}

Agora é a parte de overload dos operadores, certo? é parte em que não pesco nada...
 
Última edição:
Ainda não consegui entender bem entender a parte do overload de operadores. Já vi imensos tutoriais mas, ainda não sei ao certo, qual é a vantagem de fazer overload a um operador..

Se me pudessem ajudar, agradecia...
 
Agora tenho o seguinte:

Código:
#include <cstdlib>
#include <iostream>

using namespace std;
//Criação das Classes

class Csphere {
    int r;
  public:
    void set_values (int);
    double volume () {return ((4/3)*3.1415*(r*r*r));}
};

class Cparalelipipedo {
    int x, y, h, vol;
  public:
    Cparalelipipedo () {};
    void set_values (int,int,int);
    int volume () {return (x*y*h); vol=x*y*h;}

};

//definir valores
void Csphere::set_values (int a) {
  r = a;
}

void Cparalelipipedo::set_values (int a,int b,int c) {
  x = a;
  y = b;
  h = c;
}

//overload de operadores
[B][COLOR=Red]Cparalelipipedo Cparalelipipedo::operator+ (Cparalelipipedo param) {[/COLOR][/B]
  Cparalelipipedo temp;
  temp.vol = vol + param.vol;
  return (temp);
}

main()
{
 int tmp; int tmp1; int tmp2;
 //criar objectos
 Csphere sphereout;
 Csphere spherein;
 Cparalelipipedo paral;
 
 //pedir valores da esfera de fora
 cout << "Insira o valor do raio de esfera que está fora do paralelipipedo";
 cin >> tmp;
 sphereout.set_values (tmp);
     //cout << "volume: " << sphereout.volume();

 //pedir valores da esfera de dentro
 cout << "Insira o valor do raio de esfera que está dentro do paralelipipedo";
 cin >> tmp;
 spherein.set_values (tmp);
     //cout << "volume: " << spherein.volume();

 //pedir valores do paralelipipedo 
 cout << "Insira o valor do comprimento do paralelipipedo";
 cin >> tmp;
 cout << "Insira o valor da largura do paralelipipedo";
 cin >> tmp1;
 cout << "Insira o valor da altura do paralelipipedo";
 cin >> tmp2;
 paral.set_values (tmp,tmp1,tmp2);
     //cout << "volume: " << paral.volume();
     
 [B][COLOR=Red]cout << paral + sphereout.volume();[/COLOR][/B]
}
Dá-me os seguintes erros:
35 no `Cparalelipipedo Cparalelipipedo: operator+(Cparalelipipedo)' member function declared in class `Cparalelipipedo'

71 no match for 'operator+' in 'paral + (&sphereout)->Csphere::volume()'
 
Última edição:
Vou dar-te um exemplo de overloading de um operador para ver se percebes a ideia.
Imagina o seguinte codigo:
Código:
string str1 = "qualquer";
string str2 = " coisa";
str1+str2;//a soma neste caso é a concatenação de strings

Confesso que não vi o teu código, mas se por exemplo para cada classe tens o volume dos sólidos, podes fazer um overloading da soma:

esfera+paralelepipedo;//esfera e paralelepipedo são objectos das classes e a soma poderia por exemplo devolver a soma dos volumes

Tens de ver que operações é que queres fazer e com que dados dos objectos, mas a ideia é sempre a mesma.


Cumps
 
Então, tipo:
Duas classes (ex):

Class esfera {int volume};

Class paralelipipedo {int volume};

Depois de fazer o overload do operador +, posso fazer o seguinte (ex):

Código:
main(){ esfera a; paralelipipedo b;
 cout << a+b \\apresenta a soma dos volumes
}
??
 
Para te ajudar nesse caso tens de criar um classe abstracta (CFiguraGeometrica) que depois as tuas classes vão herdar

Código:
class CFiguraGeometrica{

public:
    double volume() =0;     
}

class Csphere:CFiguraGeometrica{
    int r;
  public:
    void set_values (int);
    double volume () {return ((4/3)*3.1415*(r*r*r));}
};

class Cparalelipipedo:CFiguraGeometrica{
    int x, y, h, vol;
  public:
    Cparalelipipedo () {};
    void set_values (int,int,int);
    double volume () {return (x*y*h); vol=x*y*h;}

};

Depois lê a parte de polimorfismo no site que meti a cima. A resposta é fácil mas tens de chegar la sozinho :P
 
Se fizeres overloading do operador +, por exemplo, sim, podes somar duas instâncias de duas classes, para por exemplo somar os volumes ou outra coisa qualquer.
 
Já consegui fazer!
Obrigado a todos. Estou a dever-vos um café xD
Código:
#include <cstdlib>
#include <iostream>

using namespace std;
//BCriação das Classes

class Csphere {
    double r;
  public:
    void set_values (int);
    double volume () {return ((4/3)*3.1415*(r*r*r));}
};

class Cparalelipipedo {
    double x, y, h, vt;
   public:
    Cparalelipipedo () {};
    void set_values (int,int,int);
    double volume () {return (x*y*h);};
    //Roverload de operadores
    double operator + (Csphere);
    Cparalelipipedo operator - (Csphere);
    
};

//Udefinir valores
void Csphere::set_values (int a) {
  r = a;
}

void Cparalelipipedo::set_values (int a,int b,int c) {
  x = a;
  y = b;
  h = c;
}

//Noverload de operadores
double Cparalelipipedo::operator+ (Csphere param) {
  return( vt + param.volume());
}

Cparalelipipedo Cparalelipipedo::operator- (Csphere param) {
  Cparalelipipedo temp;
  temp.vt = volume() - param.volume();
  return( temp );
}


main()
{
 int tmp; int tmp1; int tmp2;
 //Ocriar objectos
 Csphere sphereout;
 Csphere spherein;
 Cparalelipipedo paral;
 
 //Cpedir valores da esfera de fora
 cout << "Insira o valor do raio de esfera que está fora do paralelipipedo";
 cin >> tmp;
 sphereout.set_values (tmp);
     cout << "volume: " << sphereout.volume() <<"\n";

 //Apedir valores da esfera de dentro
 cout << "Insira o valor do raio de esfera que está dentro do paralelipipedo";
 cin >> tmp;
 spherein.set_values (tmp);
     cout << "volume: " << spherein.volume() <<"\n";

 //Mpedir valores do paralelipipedo 
 cout << "Insira o valor do comprimento do paralelipipedo";
 cin >> tmp;
 cout << "Insira o valor da largura do paralelipipedo";
 cin >> tmp1;
 cout << "Insira o valor da altura do paralelipipedo";
 cin >> tmp2;
 paral.set_values (tmp,tmp1,tmp2);
     cout << "volume: " << paral.volume () <<"\n";
     
 cout << " O valor total da fogura será : " << (paral - spherein) + sphereout  <<"\n";
 
    system("PAUSE");
    return EXIT_SUCCESS;
}
 
Última edição:
Back
Topo