Débutant C++ (Guki) problème avec friend

Fermé
François - 27 sept. 2004 à 16:11
 Pointcpp - 17 avril 2008 à 00:23
Bonjour,

J'ai un problème avec les fonctions friends. Impossible de faire tourner le petit programme qui se trouve à la fin de ce email. Ce programme est un exemple tiré d'un livre que j'utilise pour apprendre C++.
Un internaute a eu la gentillesse de me proposer une solution mais elle ne marche pas dans tous les cas.

Voilà les deux messages d'erreurs que j'ai à la compilation:

1- error C2248: 'num' : cannot access private member declared in class 'Ratio'
2- error C2593: 'operator +' is ambiguous


Le programe est le suivant :

#include <iomanip>
#include <iostream>
#include <ctype.h>
#include <string>
#include <fstream>
using namespace std;
class 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;
}
main()
{ Ratio x(22,7),y(-3,8),w;
w=x+y;
w.print();
}

ps : si je remplace + par * dans la fonction friend ça marche !
A voir également:

9 réponses

Salut!

J'ai exactement fait un copier coller et ça compile sans erreur sous g++. Tu compiles avec quoi?

Le résultat obtenu est 155/56

PS: Mon langage de prédilection n'est hélas pas le C++ mais un jour je m'y mettrait plus sérieusement. ;-)
0
Merci pour ta réponse.

Je compile avec Visual 6.0.

Bon ... je vais bien finir par comprendre ce qui se passe.

Francois
0
Hello !

Le programme ci-dessus comporte une erreur (C++ standard impose int comme type de retour). Si je déclare :
int main()
{
}

ça compile et j'obtiens aussi 155/16.

Note :
1. J'utilise un compilateur commercial professionnel qui est un standard C++ contrairement à MS Visual C++ 6.
2. Ne jamais utiliser les fonctions friend quand on peut s'en passer. Ici c'est le cas !

Take care !
0
Les erreurs sont nombreuses dans ce code. Beaucoup trop de headers inutiles à mon goût dont certaines non standard puis l'écriture n'est pas claire.

Utiliser <cctype> au lieu de <ctype.h>.
De même <cstring> au lieu de <string.h>.

Les seules headers utiles sont:

<cstdlib> pour la macro EXIT_SUCCESS si on la place dans le return de la fonction main.
<iostream> pour la fonction cout.

Bon voici une 1ère version un peu épurée:

/*
test.c++
*/

#include <cstdlib>
#include <iostream>

using namespace std;

class Ratio
{
friend Ratio operator+(const Ratio&, const Ratio&);
private :
int num;
int den;
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();
};

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;
}

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

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

Il reste encore à faire mais c'est déjà un début.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Hello !

À mon avis, la fonction print() va avoir du mal à trouver num et den...
;)

Take care
0
Oui c'est sur mais c'est juste pour donner la forme de quelque chose qui semble propre. :-P
0
Bonjour,

Merci à tous pour le temps que vous m'avez consacré.
J'en suis arrivé à la conclusion qu'il y a un problème avecle compilateur que j'utilise.
Ce matin j'ai téléchagé et installé un logiciel gratuit que j'ai trouvé sur le web (dev-C++). Tous les programmes passent à la compilation.
D'après les tests que vous avez réalisés, il semblait bien que ça devait marcher.
J'ai bien étudié les programmes que vous m'avez envoyés pour ce sujet (et un autre que j'avais ouvert auparavant). Je vais tenir compte de toutes vos remarques !

En fait j'ai un autre problème avec le nouveau compilateur. C'est un problème différent et je pense que je vais ouvrir un autre sujet.

Encore merci !
Amicalement
François
0
Salut à tous,

Je viens moi aussi de rencontre la même problème. Je compiles mon programme qui contient une classe avec une fonction friend, et un message d'erreur apparait..... avec Microsoft Visual 6 C++ !
0
Youpi ! Je viens de régler notre problème François.

Il suffit d'installer le service pack à cette adresse :

http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp6/default.aspx

Merci à Leor Zolman
http://www.talkroot.com/archivee/index.php/t-49863_C++_friend_function.html
0
Joli
0