Débutant en C++; Problèmes dans un petit test

Francois -  
 Guki -
Bonjour,

Depuis quelques jours j'apprends C++ en suivant un livre dont j'essaye de faire les exemples.
J'ai un sérieux problème avec les "overloading operator".
J'apprécierais beaucoup que quelqu'un m'aide.
Voilà le problème.
Je définis une classe Ratio (nombre rationnel) dont je veux faire la somme et le produit de deux éléments. Dans l'exemple qui suit, le produit marche bien mais si j'enlève les commentaires pour tester la somme j'ai deux messages d'erreurs:

1- exemple11-04.cpp(25) : error C2248: 'num' : cannot access private member declared in class 'Ratio'
2-exemple11-04.cpp(34) : error C2593: 'operator +' is ambiguous

Quelqu'un peut-il me dire ce qui se passe ?
Merci beaucoup !
J'ai l'impression que je ne suis pas au bout de mes peines ....

#include <iomanip>
#include <iostream>
#include <ctype.h>
#include <string>
#include <fstream>
using namespace std;
class Ratio
{
// friend Ratio operator+(const Ratio&, const Ratio&);
friend Ratio operator*(const Ratio&, const Ratio&);
public :
Ratio (int n=0, int d=1) : num(n), den(d) {};
Ratio(const Ratio& r) : num(r.num), den(r.den) {};
Ratio& operator=(const Ratio&);
void print() const {cout << num <<'/' << den << endl;};
private :
int num, den;
};
Ratio& Ratio::operator=(const Ratio& r)
{ num=r.num;
den=r.den;
return *this;
}
//Ratio operator+(const Ratio& x, const Ratio& y)
//{ Ratio z (x.num*y.den+y.num*x.den,x.den*y.den);
// return z;
//}
Ratio operator*(const Ratio& x, const Ratio& y)
{ Ratio z (x.num*y.num,x.den*y.den);
return z;
}
main()
{ Ratio x(22,7),y(-3,8),w;
// w=x+y;
w=x*y;
w.print();
}
A voir également:

4 réponses

Jolkdarr
 
Hello !

Il faut aussi ne pas mettre en commentaire la ligne :
// friend Ratio operator+(const Ratio&, const Ratio&); 

Ca doit marcher si tu le fais.

Remarque :
1. Les ";" après les blocs {} ne servent à rien.
2. La fonction doit retourner int mais tu n'es pas obligé de mettre un return.
3. La fonction print est inélégante.
4. Les opérateurs + et - sont définis dans ton programme comme des fonctions indépendantes de la classe, ce qui implique de les déclarer friend. Il est plus élégant de les déclarer comme des fonctions membre à part entière comme ci-dessou :
#include <iostream>

using namespace std;

class Ratio
{
public :
	Ratio(int n=0, int d=1) : num(n), den(d) {}
	Ratio(const Ratio& r) : num(r.num), den(r.den) {}
	
	Ratio& operator=(const Ratio& r);
	Ratio operator+(const Ratio& y) const;
	Ratio operator*(const Ratio& y) const;

	void print() const { cout << num <<'/' << den << endl; }

private :
	int num, den;
};

Ratio& Ratio::operator=(const Ratio& r)
{
	num = r.num;
	den = r.den;

	return *this;
}

Ratio Ratio::operator+(const Ratio& y) const
{
	return Ratio(num * y.den + y.num * den, den * y.den);
}

Ratio Ratio::operator*(const Ratio& y) const
{
	return Ratio(num * y.num, den * y.den);
}

int main()
{
	Ratio x(22,7), y(-3,8);
	Ratio w = x + y;
	w = x * y;
	w.print();
}


Take care !
0
Jolkdarr
 
Retour sur l
0
François
 
Bonjour,

Votre solution pour additionner deux fractions fonctionne à merveille !!
Merci.beaucoup.

En ce qui concerne les commentaires que j'ai introduits dans l'exemple, ils sont là pour faire tourner la multiplication.
Si je les enlève j'ai les deux erreurs que j'ai signalées. Pire que ça ! Des que j'utilise friend avec autre chose que la multiplication j'ai le meme message d'erreur. Est ce que ça peut venir de mon compilateur ?

François
0
Jolkdarr
 
Retour sur la fonction print...
(Je finis, y'a un chat qu'a marché sur le clavier.)

La fonction print mérite d'être remplacée par un opérateur d'insertion (<<) comme dans le programme suivant (où j'ai supprimé l'opérateur = déjà fournit par le langage) :
#include <iostream>

using namespace std;

class Ratio
{
	friend ostream& operator<<(ostream& Flux, const Ratio& R);

public :
	Ratio(int n=0, int d=1) : num(n), den(d) {}
	Ratio(const Ratio& r) : num(r.num), den(r.den) {}
	
	Ratio operator+(const Ratio& y) const;
	Ratio operator*(const Ratio& y) const;

private :
	int num, den;
};

Ratio Ratio::operator+(const Ratio& y) const
{
	return Ratio(num * y.den + y.num * den, den * y.den);
}

Ratio Ratio::operator*(const Ratio& y) const
{
	return Ratio(num * y.num, den * y.den);
}

ostream& operator<<(ostream& Flux, const Ratio& R)
{
	return Flux <<  R.num <<'/' << R.den;
}

int main()
{
	Ratio x(22,7), y(-3,8);
	Ratio w = x + y;
	w = x * y;
	cout << w << endl;
}


Cette fois, il faut déclarer en friend car le premier argument de l'opérateur n'est pas de type Ratio&.

Take care !
0
simplement moi Messages postés 20 Date d'inscription   Statut Membre Dernière intervention   2
 
bonjour
vous pourriez me faire débuuté en c++ parce que javais commencé le visual basic mais g vu que cété nul !
0
Guki
 
Salut!

Ouvre un autre sujet & je pourrai t'éclairer sur la question.
0