Bonjour,<br><br>
Alors voila je suis sur le TP:La poo en pratique<br>
A la compile il me dit sa:<br>
error: request for member 'afficher' in 'resultat', which is of non-class type<br><br>
main.cpp<br><pre class="brush: cpp;">ZFraction fraction1(4, 2), fraction2(10, 20);
ZFraction resultat();
fraction1.afficher();
resultat.afficher();//Erreur
cout<<endl<<endl;
</pre><br><br>
Je supose que ce sont mes constructeurs qui ont un soucis.<br><br>
ZFaction.cpp<br><pre class="brush: cpp;">ZFraction::ZFraction() : m_numerateur(0), m_denominateur(0)
{
//ctor
}
ZFraction::ZFraction(int entier) : m_numerateur(entier), m_denominateur(1)
{
//ctor
}
ZFraction::ZFraction(int numerateur, int denominateur)
{
m_numerateur=numerateur/pgcd(numerateur,denominateur);
m_denominateur=denominateur/pgcd(numerateur,denominateur); //ctor
</pre><br><br>
Toutes reponse sera la bienvenu :-)Le 27 décembre 2011 à 20:18:57
Bonjour,
Alors voila je suis sur le TP:La poo en pratique
A la compile il me dit sa:
error: request for member 'afficher' in 'resultat', which is of non-class type
En gros tu as fait appel à une méthode qui n'existe pas dans la classe ZFraction<br>
EDIT: Est ce normal que ZFraction resultat ne prenne pas de paramètres ?Le 27 décembre 2011 à 20:31:28
En gros tu as fait appel à une méthode qui n'existe pas dans la classe ZFraction
EDIT: Est ce normal que ZFraction resultat ne prenne pas de paramètres ?
L'informaticien intelligent évite le codage inutile !!
En enlevant les parenthèses c'est pareille<br><br>
et oui c'est pour l'instant normal car je voulais tester mes constructeurs et j'ai le même message si je fait<br>
ZFraction fraction2(10);<br><br>
edit:<br><br>
Ce n'est pas le même message d'erreur pour ZFraction resultat:<br>
error: call of overloaded 'ZFraction()' is ambiguous<br>Le 27 décembre 2011 à 20:45:36
En enlevant les parenthèses c'est pareille
et oui c'est pour l'instant normal car je voulais tester mes constructeurs et j'ai le même message si je fait
ZFraction fraction2(10);
edit:
Ce n'est pas le même message d'erreur pour ZFraction resultat:
error: call of overloaded 'ZFraction()' is ambiguous
Tu peux donner le code entier, avec les 3 fichiers ? ( Et tu utilise bien les balises codes C++ ? Car ton code n'est pas coloré)Le 27 décembre 2011 à 20:52:05
Tu peux donner le code entier, avec les 3 fichiers ? ( Et tu utilise bien les balises codes C++ ? Car ton code n'est pas coloré)
Dans ton 3ème constructeur, ne simplifie pas la fraction, créer une fonction membre de ta classe " void simplifie() ", qui s'occupera de diviser le numérateur et le dénominateur par leur PGCD, ici contente toi d'affecter numerateur à m_numerateur et denominateur avec m_denominateur.<br>
La fonction " operator+" est, comme son nom l'indique une fonction, dans ton fichier .h, le prototype doit être en dehors de la classe, c'est l'operator "+=" qui doit être une méthode.<br>
Dans ta méthode " afficher ", pourquoi le fais-tu sur 3 lignes ? Fais le en 1 seule, c'est plus facile : cout << m_numerateur "/" << m_denominateur << endl;<br><br>
Pour ton erreur, je vais copier-coller ton code et essayer de t'aiderLe 27 décembre 2011 à 21:03:07
Dans ton 3ème constructeur, ne simplifie pas la fraction, créer une fonction membre de ta classe " void simplifie() ", qui s'occupera de diviser le numérateur et le dénominateur par leur PGCD, ici contente toi d'affecter numerateur à m_numerateur et denominateur avec m_denominateur.
La fonction " operator+" est, comme son nom l'indique une fonction, dans ton fichier .h, le prototype doit être en dehors de la classe, c'est l'operator "+=" qui doit être une méthode.
Dans ta méthode " afficher ", pourquoi le fais-tu sur 3 lignes ? Fais le en 1 seule, c'est plus facile : cout << m_numerateur "/" << m_denominateur << endl;
Pour ton erreur, je vais copier-coller ton code et essayer de t'aider
Tout d'abord merci<br><br>
Pour afficher, j'avais avant de l’écrire comme sa, fais en sorte que cela ressemble a une véritable fraction mais j'ai fini par simplifier.<br><br>
Pour ce qui concerne le 3 éme constructeur es une faute de faire cela ?<br><br><br>
et encore merci<br>Le 27 décembre 2011 à 21:09:58
Tout d'abord merci
Pour afficher, j'avais avant de l’écrire comme sa, fais en sorte que cela ressemble a une véritable fraction mais j'ai fini par simplifier.
Pour ce qui concerne le 3 éme constructeur es une faute de faire cela ?
Non mais pour des raisons de simplicité :).<br>
J'ai essayé ton code, je n'obtiens pas les mêmes erreurs que toi, déjà tu as un constructeur en trop, ton premier constructeur ne prend pas de paramètres, ca c'est bon mais ton deuxième en prend un mais qui a une valeur par défaut, donc on n'est pas obligé de le mettre, résultat le "programme" ne sait pas lequel des deux utiliser.<br>
Aussi, dans ton fichier.h, "include<iostream>", doit se faire après les 2 lignes du début, et tu n'as pas de besoin d'inclure "string".<br>Le 27 décembre 2011 à 21:18:27
Non mais pour des raisons de simplicité :).
J'ai essayé ton code, je n'obtiens pas les mêmes erreurs que toi, déjà tu as un constructeur en trop, ton premier constructeur ne prend pas de paramètres, ca c'est bon mais ton deuxième en prend un mais qui a une valeur par défaut, donc on n'est pas obligé de le mettre, résultat le "programme" ne sait pas lequel des deux utiliser.
Aussi, dans ton fichier.h, "include<iostream>", doit se faire après les 2 lignes du début, et tu n'as pas de besoin d'inclure "string".
J'ai supprimer le second constructeur mais toujours la même erreur "Ambigous"<br><br>
En ce qui concerne le second constructeur je voulais qu'il me créer une fraction quand l'on rentre seulementun entier<br><br>Le 27 décembre 2011 à 21:31:04
J'ai supprimer le second constructeur mais toujours la même erreur "Ambigous"
En ce qui concerne le second constructeur je voulais qu'il me créer une fraction quand l'on rentre seulementun entier
Fais seulement un constructeur : <br><br>
Zfraction::Zfraction(int numerateur, int denominateur) : m_numerateur(numerateur), m_denominateur(denominateur)<br>
{<br><br>
}<br>
Et dans le prototypes dans le .h, tu mettra en valeur par défaut 0 et 1. Comme si l'utilisateur n'envoie pas de paramètre, la fraction vaudra 0/1, si il n'envoie pas le dénominateur et 2 au numérateur, elle vaudra 2/1, si il fait l'inverse, elle vaudra 1/2, et si il envoie les 2 bah c'est encore mieux <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies">Le 27 décembre 2011 à 21:37:09
Fais seulement un constructeur :
Zfraction::Zfraction(int numerateur, int denominateur) : m_numerateur(numerateur), m_denominateur(denominateur)
{
}
Et dans le prototypes dans le .h, tu mettra en valeur par défaut 0 et 1. Comme si l'utilisateur n'envoie pas de paramètre, la fraction vaudra 0/1, si il n'envoie pas le dénominateur et 2 au numérateur, elle vaudra 2/1, si il fait l'inverse, elle vaudra 1/2, et si il envoie les 2 bah c'est encore mieux
J'avais penser a sa au début mais j'ai cru comprendre dans le TP que sans argument je devais retourné 0/0<br><br>
Qst : Sans cette erreur es-que le code d'origine marche avec les 3 constructeurs ?Le 27 décembre 2011 à 21:43:33
J'avais penser a sa au début mais j'ai cru comprendre dans le TP que sans argument je devais retourné 0/0
Qst : Sans cette erreur es-que le code d'origine marche avec les 3 constructeurs ?
Oui sauf que tu as un problème avec l'operateur "+", tu as confondu l'opérateur "+" qui doit être déclaré EN DEHORS de la classe dans le .h, et l'operateur "+=" qui lui doit être une méthode de la classe, regarde bien le tuto, tu as mal déclaré ta fonction " operator+", en fait tu as défini la fonction comme "operator+=", sauf que ce n'est pas operator+= :p.<br>
"Operator+" => Zfraction operator+(Zfraction const &a, Zfraction const &b);Le 27 décembre 2011 à 21:47:07
Oui sauf que tu as un problème avec l'operateur "+", tu as confondu l'opérateur "+" qui doit être déclaré EN DEHORS de la classe dans le .h, et l'operateur "+=" qui lui doit être une méthode de la classe, regarde bien le tuto, tu as mal déclaré ta fonction " operator+", en fait tu as défini la fonction comme "operator+=", sauf que ce n'est pas operator+= :p.
"Operator+" => Zfraction operator+(Zfraction const &a, Zfraction const &b);
Oui mais a par sa tout devrais fonctionner cela est très ... <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/angry.gif" alt=":colere:" class="smilies"><br><br>Le 27 décembre 2011 à 21:55:28
Oui mais a par sa tout devrais fonctionner cela est très ...
En faite maintenant je me casse la tête avec la fonction<br>
void simplifie()<br><br>
je ne sais pas vraiment comment faire apparemment sa devrais simplifier mais j'ai l'impression de faire compliqué dois-je faire des accesseur pour M_numérateur et m_dénominateur<br><br>
EDIT:<br><br>
Merci je continuerais demain a ++Le 27 décembre 2011 à 22:08:45
En faite maintenant je me casse la tête avec la fonction
void simplifie()
je ne sais pas vraiment comment faire apparemment sa devrais simplifier mais j'ai l'impression de faire compliqué dois-je faire des accesseur pour M_numérateur et m_dénominateur
Non, la méthode simplifie(), fait partie de la classe, tu peux donc utiliser ses attributs sans problèmes, tu as écris la fonction pgcd.<br>
Pour simplifier une fraction, on divise le numérateur et le dénominateur par leur pgcd, donc en gros dans ta fonction simplifie tu fais quelquechose du genre :<br><br>
int nombre = pgcd(m_numerateur,m_denominateur)<br>
// Donc là nombre aura pour valeur le pgcd du numerateur et denominateur de ta fraction<br>
Et :<br>
m_numerateur /= pgcd;<br>
m_denominateur /=pgcd;<br>
// Tu divises le numerateur et le denominateur par le pgcd de ces 2 nombres, ta fraction sera alors irréductible.Le 27 décembre 2011 à 22:13:00
Non, la méthode simplifie(), fait partie de la classe, tu peux donc utiliser ses attributs sans problèmes, tu as écris la fonction pgcd.
Pour simplifier une fraction, on divise le numérateur et le dénominateur par leur pgcd, donc en gros dans ta fonction simplifie tu fais quelquechose du genre :
int nombre = pgcd(m_numerateur,m_denominateur)
// Donc là nombre aura pour valeur le pgcd du numerateur et denominateur de ta fraction
Et :
m_numerateur /= pgcd;
m_denominateur /=pgcd;
// Tu divises le numerateur et le denominateur par le pgcd de ces 2 nombres, ta fraction sera alors irréductible.
bon je poste ce que j'ai fait pour l'instant puis je continuerais demains <br><br>
main<br><pre class="brush: cpp;">#include <iostream>
#include <string>
#include "ZFraction.h"
using namespace std;
int main()
{
ZFraction fraction1(4, 2), fraction2(10), resultat;
fraction1.simplifie();
fraction1.afficher();
cout<<endl<<endl;
fraction2.simplifie();
fraction2.afficher();
cout<<endl<<endl;
resultat.afficher();
cout<<endl<<endl;
return 0;
}
</pre><br><br><br>
Zfraction.cpp<br><pre class="brush: cpp;">#include <iostream>
#include <string>
#include "ZFraction.h"
using namespace std;
ZFraction::ZFraction(int numerateur, int denominateur) : m_numerateur(numerateur), m_denominateur(denominateur)
{
}
void ZFraction::simplifie()
{
int nombre = pgcd(m_numerateur,m_denominateur);
m_numerateur/=nombre;
m_denominateur/=nombre;
}
void ZFraction::afficher() const
{
cout<<m_numerateur<<"/"<<m_denominateur;
}
ZFraction& operator+(const ZFraction &fraction)
{
}
ZFraction operator+(ZFraction const& a, ZFraction const& b)
{
}
int pgcd(int a, int b)
{
while (b != 0)
{
const int t = b;
b = a%b;
a=t;
}
return a;
}
</pre><br><br>
ZFraction.h<br><pre class="brush: cpp;">#ifndef ZFRACTION_H
#define ZFRACTION_H
#include <iostream>
#include <string>
class ZFraction
{
public:
ZFraction();
ZFraction(int numerateur = 0, int denominateur = 1) ;
ZFraction& operator+=(const ZFraction &fraction);
void afficher() const;
void simplifie();
private:
int m_numerateur;
int m_denominateur;
};
ZFraction operator+(ZFraction const& a, ZFraction const& b);
int pgcd(int a, int b);
#endif // ZFRACTION_H
</pre><br><br>
Ce code ne marche pas a moins que pour ZFraction resultat; je l'initialise a resultat(1) (dans le main)Le 27 décembre 2011 à 22:49:55
bon je poste ce que j'ai fait pour l'instant puis je continuerais demains
Ok, bonne chance alors ( euh petite erreur de ta part) : ligne 31 à 34, c'est bon mais<br>
ligne 26 à 29 tu as écris "operator+" au lieu de "operator+=" et c'est une méthode de la classe donc le nom de la fonction doit être : "ZFraction& ZFraction::operator+=(ZFraction const &fraction).<br><br><img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies">Le 27 décembre 2011 à 22:56:43
Ok, bonne chance alors ( euh petite erreur de ta part) : ligne 31 à 34, c'est bon mais
ligne 26 à 29 tu as écris "operator+" au lieu de "operator+=" et c'est une méthode de la classe donc le nom de la fonction doit être : "ZFraction& ZFraction::operator+=(ZFraction const &fraction).
Derien, n'oublie pas que qund tu écriras le code des fonctions operator+ et operator +=, tu pourras retirer dans ton main le fraction1.simplifie(); , dans ton " operator+=" qui est une méthode de la classe, tu auras juste à écrire dans la dernière ligne un simple : simplifie(); pour appeler la fonction et qu'elle te renvoie le résultat directement simplifié.Le 27 décembre 2011 à 23:25:28
Derien, n'oublie pas que qund tu écriras le code des fonctions operator+ et operator +=, tu pourras retirer dans ton main le fraction1.simplifie(); , dans ton " operator+=" qui est une méthode de la classe, tu auras juste à écrire dans la dernière ligne un simple : simplifie(); pour appeler la fonction et qu'elle te renvoie le résultat directement simplifié.
Salut, je vois encore une erreur :<br>
C'est peut-être un oubli, mais dans la dernière version du code que tu as posté, tu as laissé le constructeur sans argument dans la déclaration de ta classe. En fait c'est à cause de lui que tu avais l'erreur "call of overloaded 'ZFraction()' is ambiguou".<br>
Cela est dû au fait que ton constructeur sans argument et ton constructeur avec arguments par défaut peuvent tout deux être appelés de la même façon : sans argument. Et là le compilateur fait bien de râler, parce que, comme il te le dit, il ne sais pas quelle version appeler, vu que les deux versions qu'il connait sont envisageables.<br>
La solution : tu vires le constructeur sans argument, vu que tu en as un qui propose deux arguments par défaut, il fait lui-même le boulot pour le cas où un utilisateur ne fournirait pas d'argument.<br><br>
PS : Peut-être est-ce ce que tu avais commencé à faire car je vois que tu avais enlevé la définition de ce constructeur sans argument. Va jusqu'au bout et enlève-le aussi dans ton .h <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies"> (si c'est le comportement que tu attends, bien sûr)Le 28 décembre 2011 à 1:16:48
Salut, je vois encore une erreur :
C'est peut-être un oubli, mais dans la dernière version du code que tu as posté, tu as laissé le constructeur sans argument dans la déclaration de ta classe. En fait c'est à cause de lui que tu avais l'erreur "call of overloaded 'ZFraction()' is ambiguou".
Cela est dû au fait que ton constructeur sans argument et ton constructeur avec arguments par défaut peuvent tout deux être appelés de la même façon : sans argument. Et là le compilateur fait bien de râler, parce que, comme il te le dit, il ne sais pas quelle version appeler, vu que les deux versions qu'il connait sont envisageables.
La solution : tu vires le constructeur sans argument, vu que tu en as un qui propose deux arguments par défaut, il fait lui-même le boulot pour le cas où un utilisateur ne fournirait pas d'argument.
PS : Peut-être est-ce ce que tu avais commencé à faire car je vois que tu avais enlevé la définition de ce constructeur sans argument. Va jusqu'au bout et enlève-le aussi dans ton .h (si c'est le comportement que tu attends, bien sûr)
Oui enlève le prototype du premier constructeur dans ton .h, ton compilateur ne saura toujours pas quelle version utiliser, là j'ai copié-collé ton code, tu n'as normalement aucune erreur <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies"><br><br>
Te reste plus qu'à implémenter l'opérateur "<<", "+","+=","*","*=" etc.. <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/pirate.png" alt=":pirate:" class="smilies">Le 28 décembre 2011 à 12:24:50
Oui enlève le prototype du premier constructeur dans ton .h, ton compilateur ne saura toujours pas quelle version utiliser, là j'ai copié-collé ton code, tu n'as normalement aucune erreur
Te reste plus qu'à implémenter l'opérateur "<<", "+","+=","*","*=" etc..
C'est beaucoup mieux <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies"><br>
Petite remarque : Dans ZFraction.cpp, ligne 48 à 56, tu peux virer la première ligne : ZFraction copie(m_denominateur)...<br>
Elle ne sert à rien puisque,au final tu n'utilise meme pas les objets copie1 et copie2<br><img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies">Le 28 décembre 2011 à 15:44:12
C'est beaucoup mieux
Petite remarque : Dans ZFraction.cpp, ligne 48 à 56, tu peux virer la première ligne : ZFraction copie(m_denominateur)...
Elle ne sert à rien puisque,au final tu n'utilise meme pas les objets copie1 et copie2
Oups c'est vrais un oublie de mon copie collé <br>
En se qui concerne << je ni arrive pas <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/mechant.png" alt=":colere2:" class="smilies"><br><br>
Qu'es que je fais mal???Le 28 décembre 2011 à 15:49:02
Oups c'est vrais un oublie de mon copie collé
En se qui concerne << je ni arrive pas
de meme tu pourrai faire appel a ta fonction simplifie() dans le constructeur pour être sur de travailler avec des fractions déjà simplifiée et comme sa si tu veux les afficher, tu a quelque chose de correctLe 28 décembre 2011 à 15:57:15
de meme tu pourrai faire appel a ta fonction simplifie() dans le constructeur pour être sur de travailler avec des fractions déjà simplifiée et comme sa si tu veux les afficher, tu a quelque chose de correct
1-Comme il est préférable de pas utiliser "using namespace std" dans les fichiers headers(*.h), dans le prototype de ton operateur " << ", tu dois rajouter std:: aussi devant ostream ( le 1er mot de ta ligne)<br>
Et aussi, tu as mis une accolade en trop dans ton main<br><img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/smile.png" alt=":)" class="smilies">Le 28 décembre 2011 à 15:59:28
1-Comme il est préférable de pas utiliser "using namespace std" dans les fichiers headers(*.h), dans le prototype de ton operateur " << ", tu dois rajouter std:: aussi devant ostream ( le 1er mot de ta ligne)
Et aussi, tu as mis une accolade en trop dans ton main
L'accolade n'est que sur le site<br><br>
et merci pour le std:: c'est <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/angry.gif" alt=":colere:" class="smilies"> que sa ne soit que sa <img src="/bundles/tinymce/vendor/tiny_mce/plugins/emotions/img/pirate.png" alt=":pirate:" class="smilies">Le 28 décembre 2011 à 16:04:57
L'accolade n'est que sur le site
et merci pour le std:: c'est que sa ne soit que sa
Encore une chose, le code n'affichera pas ce que tu veux , dans ton main, tu n'affiche à aucun moment "fraction2" , tu dois faire :<br><br><pre class="brush: cpp;">cout << fraction1;
cout <<"+";
cout << fraction2;
cout << "=";
</pre><br>
Le changement se trouve à la 3e ligne de mon code// Tu as défini l'opérateur " << " et "+" avec "+=" donc remplace : <br><pre class="brush: cpp;">(fraction1+fraction2).afficher();
</pre><br>
par :<br><pre class="brush: cpp;">cout << fraction1 + fraction2;
</pre>Le 28 décembre 2011 à 16:09:33
Encore une chose, le code n'affichera pas ce que tu veux , dans ton main, tu n'affiche à aucun moment "fraction2" , tu dois faire :