overload <<, probleme :/ - C++ - Programmation
Marsh Posté le 12-03-2004 à 15:35:48
L'"operator <<" et l'"operator >>" ne peuvent pas être des fonctions membres de classe parceque le premier paramètre doit être un istream/ostream et qu'il ne t'est pas possible d'ajouter des fonctions membres dans ces classes ( pas proprement en tout cas )
Marsh Posté le 12-03-2004 à 21:43:44
Comment je dois faire alors ?
c est la qu intervient les class friends non ?
Marsh Posté le 12-03-2004 à 21:48:28
oui et non. si tu peux t'en passer cai mieux, cai en dernier recours
le problème des friends, c'est que c'est des passe-droit. et j'aime assez peu que des opérations comme la comparaison ou l'affichage soit planquées derrière un friend, comme si ces opérations publiques devaient reposer sur des données cachées : si je n'ai pas le droit de savoir ce qui est affiché et sur quoi est basé la comparaison, j'aime assez peu. mais c'est personnel comme point de vue
Marsh Posté le 12-03-2004 à 22:01:32
qu elle solution me rest il alors ? vu que la sa marche pas ..
Marsh Posté le 12-03-2004 à 22:07:13
faire un joli Iterator et voilà, puis faire une fonction externe qui affiche comme tu veux
Marsh Posté le 12-03-2004 à 22:12:32
hum sa me complique la tache je n ai jamais fais d iterator, je vais essayer ..
Marsh Posté le 12-03-2004 à 22:15:13
enfin, du moins, vois comment tu fais pour afficher un tableau : tu affiches chaque élément auxquels tu as acces. défini une façon d'avoir accès à tes éléments, et affiche les
Marsh Posté le 16-03-2004 à 11:53:16
>défini une façon d'avoir accès à tes éléments, et affiche les
et paf tu petes l'encapsulation ,
d'ou le friend..
Marsh Posté le 17-03-2004 à 04:43:37
meme en mettant friend devant ma fonction le message d erreur reste le meme
Marsh Posté le 17-03-2004 à 09:11:08
frenchkiss a écrit : >défini une façon d'avoir accès à tes éléments, et affiche les |
euh non
Code :
|
c'ets propre, respecte l'encapsulation et evite le friend.
Evidemment la classe est purement bateau.
Marsh Posté le 17-03-2004 à 10:35:31
...
ouai ton getValue rentoure T
puis tu fais un os << T
bravo!!!
tu m expliques ce que t as resolu la?
..a part rajouter une couche
>euh non
ben si , si ta logique c est de dire "je peux afficher que ce que je peux acceder" cf:
>comme si ces opérations publiques devaient reposer sur des >données cachées : si je n'ai pas le droit de savoir ce qui est >affiché et sur quoi est basé la comparaison, j'aime assez peu
alors ca veut dire que tu vas devoir mettre des accesseurs public pour tes donnees private, et ainsi permettre a n importe qui de visualiser ces donnees. si ca c 'est pas violer l encapsulation.
Je peux comprendre la reticence que vous avez a utiliser friend.
puisque c'est un mecanisme puissant qui si mal utilise permet de faire a peu pres n importe quoi.
c'est la raison pour laquelle il faut l'utiliser au bon moment. la surchage de l operatuer en fait parti a mon avis.
et si on prends un exemple:
voiture et garagiste
le garagiste pourrait tres bien etre un friend de la voiture sur certainnes de ces methodes getmotor() par exemple
l avantage c est aue le moteur n est accessible qu'au garagiste et que le conducteur par exmple n'aurai pas le droit d y toucher.
donc le friend dans ce cas permet au contraire de renforcer l'encapsulation en evitant de mettre un accesseur publique qui ne serve qu'au garagiste ( et je parle meme pas du replaceMotor par exemple)
fk
Marsh Posté le 17-03-2004 à 12:19:48
en meme temp mon pb est toujours la, sa serait bien de donner des examples se basant sur ma template
Marsh Posté le 17-03-2004 à 13:23:54
frenchkiss a écrit : |
ben non.
@xiluoc :
tu peut te faire une methode print() publique de ton cercle qui prend en param un ostream
et surchargé ostream pour appeler print. je vois que ca pour eviter le friend.
Marsh Posté le 17-03-2004 à 13:35:01
mais pour linstant c est aps trop grave d eviter le friend ou non tout ce qeu j eveus c est que ca marche, ensuite j essaieria sans le friend
Code :
|
retourn la meme erreur
Marsh Posté le 17-03-2004 à 13:35:05
frenchkiss a écrit : |
bon alors au temps pour moi :
http://www.gotw.ca/gotw/070.htm
bref, friend sur ostream ca passe. malheureusement pour lui ici, le friend template va avoir du mal à passer.
Marsh Posté le 17-03-2004 à 13:39:07
xiluoc a écrit : mais pour linstant c est aps trop grave d eviter le friend ou non tout ce qeu j eveus c est que ca marche, ensuite j essaieria sans le friend |
Essaye :
Code :
|
Le modificateur friend ne marche que sur des classes ou fonctions.
OR ici tu l'affecte à une fonction template, un MODELE, il faut donc l'insatncier pour permettre de lui affecter le modificateur friend.
je suis pas super clair mais l'idée c'est ca.
tested & approved gcc 3.3
@frenchkiss : on pensait la même chose mais j'avais pas compris, mille excuses si je me susi emporté
Marsh Posté le 17-03-2004 à 13:59:37
heu je testerai demain en reboutant sous linux.
j y crois en tous cas =)
Marsh Posté le 17-03-2004 à 14:40:10
2 soluces
no problemo joel
using namespace std;
class printable
{
//private
virtual ostream print(ostream& out) const = 0;
public:
friend ostream& operator << (ostream &out, const printable &c);
};
ostream& operator << (ostream &out, const printable &c)
{
c.print(out);
return out;
}
template <class T>
class circle : public printable {
public:
circle (T e) ;
private:
ostream print(ostream& out) const{
out<<bla;
return out;
}
circle(const circle<T> & c) {};
T bla;
};
template <class T>
circle<T>::circle (T e): bla(e){ }
template <class T>
class square {
public:
square (T e) ;
friend ostream& operator << (ostream &out, const square & sq);
private:
ostream& print(ostream& out) const{
out<<bla;
return out;
}
square(const circle<T> & c) {};
T bla;
};
template <class T>
square<T>::square (T e): bla(e){ }
template <class T>
ostream& operator << (ostream &out, const square<T> & sq)
{
sq.print(out);
return out;
}
int main(int argc, char* argv[])
{
string st("gegege" );
circle<string> moncircle( st );
cout << moncircle;
square<string> monsqaure(st);
cout<<endl<<monsqaure;
return 0;
}
Marsh Posté le 18-03-2004 à 01:32:34
ca compile bien
Code :
|
mais quand je fais cout << c; (c etant mon obket circle)
y a desmessages d erreur
je dois passer les mauvasi paramtres, ce st as comem ca qu on utlise lo verload <<?
Marsh Posté le 18-03-2004 à 01:41:59
enfin bon tout ça c'est très crade, très crade. manque des virtual dans tous les sens, et puis quand on fait des template comme ça, ça sert à rien.
débarrase toi de la classe abstraite Java-isante, elle sert à rien
Marsh Posté le 18-03-2004 à 07:21:50
Code :
|
erreur
Code :
|
Marsh Posté le 18-03-2004 à 07:29:42
apperemtn sa viens d ema fonction print
Code :
|
Marsh Posté le 18-03-2004 à 10:49:03
regarde comment est defini la fonction print de la classe square
ci dessus.
pis ton message d erruer est qd meme assez explicite , ca tu devrait le trouver tout seul hein.
tu fais un cout << c
avec
[c++]
template <class T>
ostream& operator<<(ostream &out, const circle<T> &c)
{
// out << "wewee";
out << c.printCircle();
return out;
// return out;
}
[/c++]
ton print circle tu crois qu'il fait quoi???
essaie de bien comprendre ce qu'il se passe ; et lis les messages d erreur
[taz] exact il manque un vitual sur le print de square ( si on considere que l 'on va la deriver..)
( square et circle sont 2 solutions distinctes dans mon post hein)
FK
Marsh Posté le 18-03-2004 à 10:58:41
Code :
|
Marsh Posté le 18-03-2004 à 12:08:57
hum
Code :
|
Code :
|
je dois donc faire
Code :
|
Marsh Posté le 19-03-2004 à 01:41:48
heu... j y suis presque
Code :
|
Code :
|
ca al air bon pourtant.
masi j obtiens ca :
Code :
|
Marsh Posté le 20-03-2004 à 08:23:35
le friend me sert accesder aux variables private.
j y arrive pas.
et je comprend pas le code example donne plus haut.
Code :
|
et le reste encore moins.
Pour voir mon code en entier :
http://coulix-new.ozforces.com.au/circlet.h
http://coulix-new.ozforces.com.au/josept.cc
c est quand meme assez tordu la syntax tempalte
Marsh Posté le 20-03-2004 à 08:39:56
je t'ai donné la solution bourdel ... et t'as pas besoin de cette classe printable :x
Marsh Posté le 20-03-2004 à 08:46:25
ben, tas solution marhce bien pour le <<
masi c est la fonction ostream& print circle que j arrive pas a
faire marcher.
Marsh Posté le 12-03-2004 à 15:30:22
, dans le bouquin j ai ca :
j ai une template de cette forme :
a la compilation j ai ce message d erreur :
il me parle du programme josept qui creer l objet, circle<string> c;
heu .. je comprend pas d ou viens le pb ?
merci,
Message édité par xiluoc le 12-03-2004 à 15:31:42