Class Template + Friend - C++ - Programmation
Marsh Posté le 27-11-2009 à 14:31:34
Remarque générale: oublie les char*, utilise des std::string.
Sinon, vu l'usage que tu veux, qu'est-ce qui t'empêches de faire de SaveFile une fonction membre ?
Marsh Posté le 27-11-2009 à 21:45:40
ne sert à rien , jamais, ça me semble un peu excessif de dire ça.
pour éclater une classe en deux , ça peut être pratique
Marsh Posté le 27-11-2009 à 22:09:56
et pourquoi donc tu aurais besoin de friend ?
friend pete l'encapsulation et rend le code moins générique. C'ets un hack qui ne devrait mm pas faire partie du langage
Marsh Posté le 27-11-2009 à 23:03:59
Défois une classe et uniquement une classe à besoin d'accéder aux donnés privées d'une autre classe. Avoir des get/set pour juste cette classe, ça me semble particulièrement péter l'encapsulation car ça dévoile la structure de la classe. un coup de friend et c'est réglé.
moralité avoir des amis c'est bien, C++ l'a compris.
Marsh Posté le 28-11-2009 à 08:36:25
sauf que si tu en es arrivé à ce design, c'ets que ton modèle est foireux.
donne moi un exemple et on va voir
Marsh Posté le 28-11-2009 à 13:10:31
Code :
|
Marsh Posté le 28-11-2009 à 13:12:06
sinon bon exemple la classe de tests unitaires
Marsh Posté le 28-11-2009 à 13:16:20
ou quand tu as une grosse classe que tu veux splitter en deux, pour par exemple des soucis de clarté du code, tu veux garder les deux classes intimement liées, tu veux quelles se partagent les mêmes membres, mais tu ne souhaites pas mettre des méthodes publics.
Marsh Posté le 28-11-2009 à 13:21:25
GrosBocdel a écrit : une classe de tests unitaires? |
Regarde Boost.Test et tu verras que non
Ton exemple n'est pas en un exemple vu que y a qu'une classe ...
alros file un VRAI exemple
Marsh Posté le 28-11-2009 à 13:25:43
Un des logiciels de TU du commerce fait comme ça pour instrumenter le code.
Sinon j'ai pas d'autre exemple non
Marsh Posté le 28-11-2009 à 15:22:26
template<typename T>
class Foo {
T value;
public:
Foo(const T& t) { value = t; }
friend ostream& operator<<(ostream& os, const Foo<T>& b)
{
return os << b.value;
}
};
Marsh Posté le 28-11-2009 à 15:47:10
faudrait arrêter de penser que friend c'est le mal...
Marsh Posté le 28-11-2009 à 17:11:08
c'ets pas que c'est le mal, c'ets que ca sert à rien.
l'exempel de operator<< est aussi foireux.
Marsh Posté le 28-11-2009 à 20:04:54
si. Affichez le contenu d'une classe en allant chercher des membres privés sans accesseur, c'ets comme regarder sous une jupe, ca ne se fait pas.
Marsh Posté le 28-11-2009 à 20:21:31
je trouve l'entorse à cette règle justifiée et la solution élégante
Marsh Posté le 28-11-2009 à 20:37:23
bof non. Une methode display() accéder depuis un op<< non riend l'ai tout autant.
Marsh Posté le 28-11-2009 à 20:41:52
un autre exemple :
Code :
|
Marsh Posté le 28-11-2009 à 20:52:34
et protected tu sais ce que ca veut dire ou bien o_O ?
c'ets quoi le use case de cette horreur ? genre les namespace anonymes c'est pr les bmanouches ?
Marsh Posté le 28-11-2009 à 20:56:34
ReplyMarsh Posté le 28-11-2009 à 20:58:30
Glock 17Pro a écrit : ça briserais l'encapsulation |
mais jamais de la vie !
ton truc tu sasi hein, c'ets juste ça :
Code :
|
...
Marsh Posté le 28-11-2009 à 21:02:46
ET OUI mais quelle méthode open appeler celle de Base1 ou de Base2...
Marsh Posté le 28-11-2009 à 21:06:25
t'as qu'à avoir des interfaces propres déjà
Ce use-case, comme je te l'ai dis, est moisi des sa conception. Tu hérites de deux interfaces avec les memes méthodes publiques. tu t'attends à quoi ?
utiliser un truc uniquement pour faciliter des use case eux même foireux, ca ne vaut rien.
Marsh Posté le 28-11-2009 à 21:12:49
bah imagine une classe Action, une classe Obligation toutes les deux ont une méthode price public. maintenant imagine une classe obligation convertible avec des propriétés à la fois Action et Obligation....
Marsh Posté le 28-11-2009 à 21:20:07
J'imagine surtout que tu violes pas mal de principe objet.
ObligationConvertible IS_NOT_A une Action et une Obligation et donc, pas d'héritage possible.
Action et Obligation devrait implanter l'interface "Pricable" et OC aussi, mais sans hériter de Action et de Obligation.
Marsh Posté le 28-11-2009 à 21:28:06
ca fait que le 3e
tu verras que tout exemple justifiant les friend se reecrit sans friend de manière triviale
Marsh Posté le 28-11-2009 à 21:31:04
ui mais avec l'exemple de l'operator <<, ta solution est plus verbeuse
Marsh Posté le 28-11-2009 à 21:43:02
non mais les collègues gueule quand y a trop de ligne à lire pour faire une action, alors que celle ci pourrait être écrite en prenant moins de lignes sans être moins lisible
Marsh Posté le 28-11-2009 à 21:52:13
après si ils aiment écrire du code moche, je m'en moque. C'est leur problème. Ils croient quoi ? que ca va aller moins vite
Marsh Posté le 30-11-2009 à 12:25:37
Taz a écrit : Remarque générale: oublie les char*, utilise des std::string. |
-------- Il y a des jours ou faut pas se lever.
Marsh Posté le 30-11-2009 à 12:35:55
ReplyMarsh Posté le 30-11-2009 à 14:38:06
Joel F a écrit : une methode save() et une fonction save qui appelle la dite methode. |
D`accord, mais lorsque je vais ajouter une function load, verification de l`integrite des donnees etc etc...
La semantique du soft sera immonde en procedant de cette maniere.
Marsh Posté le 30-11-2009 à 14:59:01
Joel F a écrit : si. Affichez le contenu d'une classe en allant chercher des membres privés sans accesseur, c'ets comme regarder sous une jupe, ca ne se fait pas. |
Ben sauf dans le cas d'une lib de sérialisation cf boost::serialization
Marsh Posté le 27-11-2009 à 09:41:22
Bonjour,
Comme le dis toujours Taz : pas de "PUTAIN DE FRIEND ... "
JE me demandais si il y avais une solution plus elegante que cela :
Le but est d`enregistrer les membres de mes classes etants des vect, vect<vect>, vec<list, list<pair< .... dans des repertoir correspond au nom des classes de maniere generique.
JE vous remercie d`avance.
---------------
“L'éducation est l'arme la plus puissante que l'on puisse utiliser pour changer le monde”