Les class [debutant] [Résolu]

Signaler
Messages postés
87
Date d'inscription
samedi 14 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2008
-
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
-
salut tout le monde

je viens de commencer avec la poo et je trouve plusieur problemes

j'ai une class la suivant

class fraction{

public:

int x;

int y;

fraction(int x=0,int y=1)

{

this->x=x;

this->y=y;

}

~fraction(){}

};

et une fonction

fraction operator *(fraction a, fraction b)

{

fraction t;

t.x=a.x*b.x;

t.y=a.y*b.y;

return t;

}



comment je fais si je veux avoir les champs x et y privé et en même temps la foction fraction peut acceder a ces 2 champs



merci

15 réponses

Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Mais ceci fonctionnera très bien:

class fraction{
fraction(int x=0,int y=1)
{
this->x=x;
this->y=y;
}
~fraction(){}
friend
fraction operator * (fraction a, fraction b); // il faut préciser que
la fonction operator * est amie et a le droit d'accéder au champ privés
de la classe.

private:

int x;

int y;

};

fraction operator *(fraction a, fraction b)
{
fraction t;
t.x=a.x*b.x;
t.y=a.y*b.y;
return t;
}


Mais il y a également une autre possibilité, mais qui n'est pas logique, c'est cela:

class fraction{
fraction(int x=0,int y=1)
{
this->x=x;
this->y=y;
}
~fraction(){}

fraction operator *(fraction a)

{

fraction t;

t.x=a.x*b.x;

t.y=a.y*b.y;

return t;

}
private:

int x;

int y;


};


La fonction "operator *" est ici une fonction membre, alors que dans ta
solution "operator *"est une fonction externe qui prend deux arguments.
Utiliser cette fonction externe est mieux car elle est plus logique
d'un point de vue mathématique.



J'ai répondu a ta question ?
Messages postés
24
Date d'inscription
lundi 14 mars 2005
Statut
Membre
Dernière intervention
31 mars 2006

essaye ca:

class fraction{
public:
fraction(int x=0,int y=1)
{
this->x=x; // Pas beau, mais c'est ton choix
this->y=y;
}
~fraction(){}

fraction operator *(fraction a, fraction b)
{
fraction t;
t.x=a.x*b.x;
t.y=a.y*b.y;
return t;
}

private:
int x;
int y;
};
Messages postés
87
Date d'inscription
samedi 14 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2008

y a t il pas une metode sans que la fonction soit inclue dans la class

si c'est pas beau ce que tu as dis pourquoi et par koi je dois le remplacer

merci
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
class fraction{
public:
int x;
int y;
fraction(int x=0,int y=1)
{
this->x=x;
this->y=y;
}
~fraction(){}

friend fraction operator * (fraction a,
fraction b); // il faut préciser que la fonction operator * est amie et
a le droit d'accéder au champ privés de la classe.
};
et une fonction
fraction operator *(fraction a, fraction b)
{
fraction t;
t.x=a.x*b.x;
t.y=a.y*b.y;
return t;
}

Mais
celui qui t'apprend a programmer, te l'apprend bien. Le "this" est une
bonne habitude. Et utiliser une fonction amie ("friend") pour un
opérateur symétrique est bcp plus logique que d'utiliser
fraction::operator *(fraction a) en fonction membre.



Seule modification a faire: tes arguments de doivent pas etre "fraction a", mais "const fraction & a".
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
En fait tu peux remplacer ca:



fraction(int x=0,int y=1)

{

this->x=x;

this->y=y;

}



par ca, si c'est ce qu'il veut dire:

fraction(int _x=0,int _y=1):

x(_x),

y(_y)

{ }



mais perso, ca change pas grand chose.
Messages postés
87
Date d'inscription
samedi 14 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2008

s'il vous plait je n'ai pas compris les modification que vous vennez de me dire

pouvez vous me dire comment j'utilise fraction::operator *(fraction a) et la diference avec cela et le this

merci
Messages postés
24
Date d'inscription
lundi 14 mars 2005
Statut
Membre
Dernière intervention
31 mars 2006

C'est pas beau -> luhtor t'a montré un exemple. Meme si ce que tu as ecrit est juste, eviye de mettre les memes noms pour les variables ca prete à confusion, tu verra ca quand ta classe aura bcp d'attributs, ce sera difficile à lire.
Messages postés
87
Date d'inscription
samedi 14 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2008

tu peux me donner un aute façon donc
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
Personnellement, des qu'une variable est passé en argument, je la
précède toujours du caractère "_". Comme ca, je sais que cette variable
a été passé en argument.fraction(int _x 0,int _y 1); et non fraction(int x = 0, int y = 1);



Enfin, ces petites règles d'écriture sont personnels, tu es libre de faire les tiennes.
Messages postés
87
Date d'inscription
samedi 14 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2008

merci

il ne reste qu'a me dire comment utiliser fraction::operator *(fraction a)
Messages postés
24
Date d'inscription
lundi 14 mars 2005
Statut
Membre
Dernière intervention
31 mars 2006

Ce qu'il faut comprendre, c'est surtout que le mot cle friend te donne acces aux parties privée de la classe, sinon tu ne peux pas y acceder.
Messages postés
24
Date d'inscription
lundi 14 mars 2005
Statut
Membre
Dernière intervention
31 mars 2006

Voici donc un exemple:

class fraction
{
public:
fraction(int x=0,int y=1)
{
this->x=x;
this->y=y;
}
~fraction(){}
fraction operator *(fraction a)
{
fraction t;
t.x=a.x * x;
t.y=a.y * y;
return t;
}


private:
int x;
int y;
};


int main(int argc, char* argv[])
{
fraction f1(10, 10), f2(2, 3), f3; // ici f3:x =0, y=1
f3 = f1 * f2; // Maintenant f3 vaut x=10x2=20 y=10x3=30


return 0;
}
Messages postés
87
Date d'inscription
samedi 14 janvier 2006
Statut
Membre
Dernière intervention
5 décembre 2008

oui merci

et pour le costructeur :

comment utiliser fraction::operator *(fraction a) à la place de this

merci a vous deux
Messages postés
688
Date d'inscription
mercredi 6 avril 2005
Statut
Membre
Dernière intervention
2 juin 2006
1
int main(int argc, char* argv[])
{
fraction f1(10, 10), f2(2, 3), f3; // ici f3:x =0, y=1
f3 = f1 * f2; // Maintenant f3 vaut x=10x2=20 y=10x3=30

f1.operator*(f3); // utilisation de l'operateur
return 0;
}

pas testé, devrait fonctionner;



@+;
satellite34

http://www.rootscommunity.com/</FON< body>
Messages postés
2023
Date d'inscription
mardi 24 septembre 2002
Statut
Membre
Dernière intervention
28 juillet 2008
5
"comment utiliser fraction::operator *(fraction a) à la place de this " <= ca ne veut rien dire



La fonction fraction::operator * (fraction a); s'utilise comme operator *(fraction a, fraction b).

C'est à dire :

fraction a(1,2);

fraction b(10, 11);



fraction c( a * b); // tu peux écrire ca, car l'opérateur * existe.



Pour écrire ca:

fraction c;

c = a * b;



Il faut créer en plus l'opérateur "=":

fraction & operator = (const fraction & _which)

{

this->x = _which.x;

this->y = _which.y;



return *this;

}



Voila comment doit etre créer l'opérateur "=".