Premier essai avec les classes : échec
Je reçois toute une floppée de "undefined reference to [...]" dans main() où j'essaie d'utiliser ma classe, qui est sensée représenter des fraction...Pouvez-vous me dire où est le problème ? Voici le code :
main.cpp :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| #include <iostream>
#include "Fraction.h"
using namespace std;
int main()
{
Fraction a(4,5); //Déclare une fraction valant 4/5
Fraction b(2); //Déclare une fraction valant 2/1 (ce qui vaut 2)
Fraction c,d; //Déclare deux fractions valant 0
c = a+b; //Calcule 4/5 + 2/1 = 14/5
d = a*b; //Calcule 4/5 * 2/1 = 8/5
cout << a << " + " << b << " = " << c << endl;
cout << a << " * " << b << " = " << d << endl;
if(a > b)
cout << "a est plus grand que b." << endl;
else if(a==b)
cout << "a est egal a b." << endl;
else
cout << "a est plus petit que b." << endl;
return 0;
} |
Fraction.h :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #ifndef FRACTION_H_INCLUDED
#define FRACTION_H_INCLUDED
#include <iostream>
class Fraction
{
private:
int numerateur;
int denominateur;
public:
Fraction();
Fraction(int a,int b);
Fraction(int a);
~Fraction();
int getnum() const; //renvoie la valeur du numerateur
int getden() const; //renvoie la valeur du denominateur
double getval() const; //renvoie la valeur numerique de la fraction
};
//puis les surcharges d'operateurs
bool operator==(Fraction const& a,Fraction const& b);
bool operator>(Fraction const& a,Fraction const& b);
int pgcd(int a,int b);
Fraction operator+(Fraction const& a,Fraction const& b);
Fraction operator*(Fraction const& a,Fraction const& b);
std::ostream& operator<<(std::ostream &flux,Fraction const& a);
#endif // FRACTION_H_INCLUDED |
Fraction.cpp :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142
| #include <iostream>
using namespace std;
int pgcd (int a,int b) //calcule le pgcd, pour pouvoir simplifier la fraction.
{
if (a<0)
{
a=-a;
}
if (b<0)
{
b=-b;
}
int c;
if (a<b)
{
c=a;
a=b;
b=c;
}
while (c!=0)
{
c=a%b;
a=b;
b=c;
}
return a;
}
class Fraction //la classe elle-meme
{
private:
int numerateur;
int denominateur;
public:
Fraction::Fraction() //constructueur de Fraction par defaut
{
numerateur=0;
denominateur=1;
}
Fraction::Fraction(int a,int b) constructeur de Fraction predeterminee
{
if (b==0)
{
cout<<"Erreur : impossible de diviser par 0. Denominateur initialise a 1."<<endl; //pas bete la mouette !
b=1;
}
int c(pgcd(a,b));
numerateur=a/c;
denominateur=b/c;
}
Fraction::Fraction(int a) //constructeur de Fraction entiere
{
numerateur=a;
denominateur=1;
}
~Fraction() //destructueur ici pour la beaute de la chose...
{
//rien
}
int Fraction::getnum() const
{
return numerateur;
}
int Fraction::getden() const
{
return denominateur;
}
double Fraction::getval() const
{
return numerateur/denominateur;
}
};
//puis les surcharges d'operateurs
bool operator==(Fraction const& a,Fraction const& b)
{
double x(a.getval());
double y(b.getval());
if (x==y)
{
return true;
}
else
{
return false;
}
}
bool operator>(Fraction const& a,Fraction const& b)
{
double x(a.getval())
double y(a.getval())
if (x>y)
{
return true;
}
else
{
return false;
}
}
Fraction operator+(Fraction const&a,Fraction const& b)
{
int numa(a.getnum());
int dena(a.getden());
int numb(b.getnum());
int denb(b.getden());
int c(dena);
numa*=denb;
dena*=denb;
numb*=c;
denb*=c;
Fraction ret(numb+numa,denb);
return ret;
}
Fraction operator*(Fraction const& a,Fraction const& b)
{
int numa(a.getnum());
int dena(a.getden());
int numb(b.getnum());
int denb(b.getden());
Fraction c(numa*numb,dena*denb);
return Fraction;
}
ostream&*operator<<(ostream*&flux,*Fraction*const&*a) //surcharge de l'operateur de flux pour cout
{
if(a.getden()==1)
{
cout<<a.getnum()<<endl;
}
else
{
cout<<a.getnum<<"/"<<a.getden<<endl;
}
return flux;
} |
Alors bien sûr je n'ai pas surchargé TOUS les opérateurs, par exemple on ne peut pas faire de division...Bon, je ne me servirais probablement pas de ça, c'était juste pour m'entraîner à utiliser les classes et les surcharges d'opérateurs qui vont avec, mais ça ne fonctionne pas...Quelqu'un peut me dire quel est le problème ?
Merci d'avance.