Tu as raison, dans le cas qui nous occupe, ce sera inliné.
J'suis tellement habitué à ne pas (assez) faire confiance aux compilos moi![]()
Tu as raison, dans le cas qui nous occupe, ce sera inliné.
J'suis tellement habitué à ne pas (assez) faire confiance aux compilos moi![]()
Mon blog anglais - Mes articles et critiques de livres - FAQ C++0x, avec liste des nouveautés - Conseils sur le C++ - La meilleure FAQ du monde - Avant de créer des classes que vous réutiliserez, regardez si ça n'existe pas déjà - Le site du comité de normalisation du C++
Le guide pour bien débuter en C++ - Cours et tutoriels pour apprendre C++
Bon, ben dans ce cas, je vais coder ça avec un héritage alors car je n'arrive pas vraiment à comprendre la méthode de Davidbrcz.
néemmoins, je laisse le sujet ouvert des fois que Jean-marc Bourguet passe dessus.
"Never use brute force in fighting an exponential." (Andrei Alexandrescu)
Mes articles dont Conseils divers sur le C++
Une très bonne doc sur le C++ (en) Why linux is better (fr)
Ben désolé, mais j'ai pour principe de ne coder que ce que je comprend. D'autre part, je ne sait pas avec quelle version de gcc la chose sera compilée et le fait que ça ne compile pas sour VC++ est éloquent quand à la possibilité d'erreur par-ce qu'on considère la chose comme une boite noire.
Enfin, je suis un incorrigible curieux et j'ai vraiment envie de savoir comment ça fonctionne.
Accessoirement , je trouve la méthode de l'héritage plus "propre" et surtout plus économique en clavier (je n'ai même pas à recoder mes fonctions).
Je viens d'y penser, mais peut-être faut-il aussi surcharger l'opérateur= et avec un opérateur inline et vide (les opérations sont faites à partir d'angle) afin d'éviter que le compilo en crée par défaut non ?
Et si oui, sur charger un seul constructeur empêche le compilo de tous les créer (en général il cré le défaut et le par copie) ou bien faut-il surcharger les deux, ( même question pour operator= ).
Merci
Si un des 4 suivants : contructeur, destructeur, constructeur de recopie ou operator= n'est pas défini et que le compilateur en a besoin, alors il va en synthétiser un par défaut.
"Never use brute force in fighting an exponential." (Andrei Alexandrescu)
Mes articles dont Conseils divers sur le C++
Une très bonne doc sur le C++ (en) Why linux is better (fr)
oui, mais si l'un est défini (par exemple angle()) et qu'il a besoin d'un autre (par exemple angle(angle)), que fait-il ?
Bah il le synthétise, il n'y a aucun rapport entre eux.
"Never use brute force in fighting an exponential." (Andrei Alexandrescu)
Mes articles dont Conseils divers sur le C++
Une très bonne doc sur le C++ (en) Why linux is better (fr)
donc pour éviter un surcoût, je dois redéfinir tout les constructeurs, destructeurs et operateurs= ?
oui, mais s'il les construit par défaut, il risque de mettre des chose dedans non ? or je préférerais que ceux-cis soient vide (je fait tout à partir de la classe angle)
...
Il ne met que les copies des objets contenus, ce que tu feras tout de même (sauf exception). Même si tu ne le fais, tu fais une initialisation, donc tu as tout de même une copie. Et dans tous les cas, c'est inlinable, donc tout bénèf.
oui, mais étant donné que je le fait déjà (agl n'est pas exactement recopié mais transformé d'un angle à l'autre), je ne voudrais pas que ça soit fait deux fois !
* template est necessaire pour le meme genre de raison que typename
* sur les aspects techniques, "ma" solution n'est pas reellement la mienne. David l'a modifiee pour la faire compiler avec g++ 4.3; a premiere vue je ne comprends pas pourquoi ces modifs sont necessaires et je n'ai pas eu le temps de regarder en details. Vu que des compilateurs differents (j'en ai essaye d'autres que g++) ont des opinions differentes sur ce code, il faut soit connaitre les regles mieux que moi sur le bout des doigts, soit replonger dans les textes.
* d'un point de vue conception, j'ai pas trop regarde mais j'ai du mal a voir ton objectif. Tu as une classe qui visiblement a une semantique de valeur, mais a un membre protected, inobservable et que tu essaies de copier. Sans une meilleure comprehension, c'est difficile de te conseiller une voie d'approche. A la premiere lecture ma reaction a ete que je mettrais agl dans une classe de base.
Ha, je savais ça pour les typename, mais j'ignorais que ça vouvais être utilisé pour indiquer la présence d'un template.(si j'ai bien compris ton annalogie, mais je ne suis pas sûr).
Par contre, dans le cas du code de david, je ne cois pas vraiment l'interet de l'indiquer puisque friend est déjà précédé d'un template<N>. En fait une traduction "en français" de la ligne m'aiderait.
A vrai dire, plus que le détail, c'est le concept qui m'échappe. et comme david n'a pas pu répondre à mes questions, je me suis adressé au créateur. Sinon, je suis preneur du code original.
C'est ce que j'ai commencé à faire, mais cela ne m'empêche pas de vouloir comprendre le code posté par david
Cordialement
J'ai l'impression que j'ai loupé un truc, mais je ne comprends pas pourquoi
ne suffit pas à résoudre ton problème ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part template<int> friend class angle;
heu, tu veux dire?
Code : Sélectionner tout - Visualiser dans une fenêtre à part template<int T> friend class angle<T>;
à vrai dire, je ne connais pas vraiment la manipulation des template avec les friends...
Non, je veux bien dire
Chez moi ça fonctionne, ton compilo râle ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part template<int> friend class angle;
avec cette déclaration, le friend est valide pour n'importe quel angle template ?
aurais-tu un cours traitant ce point, je souhaiterais approfondir .
Merci
Par contre c'est curieux, il exige que le constructeur de copie soit un angle_base & au lieu d'un angle_base ... n'y a t'il pas risque que ce paramètre soit transmis ?
? le paramètre d'un constructeur de copie doit toujours être passé par référence constante. donc c'est plutôt normal
Partager