Citation:
Envoyé par
Flob90
Si le destructeur est virtuelle pure et protégé ca garantie aussi les deux, pour ca que je ne comprends pas pourquoi ne pas utiliser cette solution ?
Non!!!
Il faudrait au minimum que le destructeur soit virtuel pur (quel que soit sa visibilité) pour qu'il puisse garantir quoi que ce soit au niveau de l'instanciabilité de la classe
Si le destructeur est protégé, tout ce qu'il peut garantir, c'est que les objets passant pour être du type de la classe de base ne pourront pas être détruit tant que l'on n'aura pas déterminé exactement quel est leur type dynamique ;)
Citation:
Non, si le big four est protégé, la seul solution (que je vois) c'est une fonction amie de la classe de base,
Ou n'importe quelle classe dérivée, car les (fonctions) membres protégés sont accessibles à toutes les classes enfants (et à leur dérivées)
Citation:
c'est moins fort qu'une classe abstraite mais ca reste un risque assez maitrisé je trouve. (Du point de vue de l'utilisateur (*) la protection est la même, par contre du point de vue du développeur la classe abstraite te protège de créer involontairement une instance).
Disons que la classe abstraite est la seule solution garantie "100% idiot proof" permettant d'assurer la non instanciabilité d'une classe.
Toute autre solution peut, certes, apporter un "certain niveau" de garantie, mais restera malgré tout contournable (la classe dérivée qui fait un new base en est un exemple, l'amitié mal gérée également ;) )
Citation:
Pour reprendre l'idée de code que tu proposes :
Code:
1 2 3 4 5
|
template<class T>
struct UseCtor : private T
{ static T* process()
{ return new T(); } }; |
Ne compile pas (à l'utilisation). :aie:
Sauf que tu changes les règles en partant sur un héritage privé, alors que j'ai chaque fois bien pris la précaution de préciser héritage public, c'est à dire une relation EST-UN, et non une relation EST IMPLEMENTEE EN TERME DE ;)
Citation:
Mais je suis d'accord avec toi, c'est la seule garantie totale de ne pouvoir créer un objet de ce type uniquement comme sous-objet :ccool: Mais si j'en ai besoin je peserais quand même le pour et le contre entre les différentes solutions.
Citation:
(*) Sauf si tu laisses à l'utilisateur le soin d'implémenter les fonctions amies et membres de la classe de base ...
Non, cela va beaucoup plus loin, car toute classe dérivant publiquement de manière directe ou indirecte de la classe de base pour laquelle tu aurais déclaré le big four en protégé est susceptible de créer une instance de la classe de base.
Or, tu peux, éventuellement, garder un oeil sur ce que toi tu fais, mais, si ta classe est destinée à être utilisée par d'autres, tu ne peux rien garantir à leur niveau :aie: