Template et singleton: problème d'utilisation [Résolu]

neodelphi 442 Messages postés jeudi 4 avril 2002Date d'inscription 11 août 2008 Dernière intervention - 29 août 2005 à 23:05 - Dernière réponse : xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention
- 30 août 2005 à 19:13
Bonjour !
Je viend de découvrir le modèle des singleton car j'en avait besoin pour mon projet. J'ai donc écrit un template classique de singleton, puis une classe censé etre un singleton:
<HR>
class CFps: CSingleton<CFps>
{
friend class CSingleton<CFps>;


private:
// Méthodes et variables
public:
// Méthodes et variables
};

<HR>

Pour utiliser le singleton je procède actuellement de la manière suivante:

<HR>
CSingleton<CFps>::getInstance()->doSomething();

<HR>

Sa compile et ça fonctionne bien, mais le problème c'est que cette synthaxe n'est pas pratique du tout, et selon la logique du langage je devrait pouvoir écrire:

<HR>
CFps::getInstance()->doSomething(); // Autorisé car CFps hérite de la méthode statique getInstance ?

<HR>

Le problème évidement est que ça ne compile pas !
error C2248: 'getInstance' : cannot access public member declared in class 'CSingleton<class CFps>'
e:\documents\projets\projectzero\csingleton.hpp(52) : see declaration of 'getInstance'

Voici donc la déclaration de getInstance, inclue dans le fichier csingleton.hpp qui contient le code écrit dans la déclaration:

<HR>
static T* getInstance()
{
if(!psingleton)
psingleton = new T;
return psingleton;
}

<HR>

L'erreur du compilateur me surprend pas mal je doit dire, car jusqu'à preuve du contraire une méthode public doit être accessible !
Merci pour votre aide

neodelphi
Afficher la suite 

15 réponses

Répondre au sujet
cosmobob 706 Messages postés mardi 30 décembre 2003Date d'inscription 27 janvier 2009 Dernière intervention - 29 août 2005 à 23:11
+3
Utile
salut,

en C++ l'héritage par défaut est privé. Pour qu'il soit public; tu dois le mettre explicitement:



class CFps: public CSingleton<CFps>

{

...

};


a+
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de cosmobob
neodelphi 442 Messages postés jeudi 4 avril 2002Date d'inscription 11 août 2008 Dernière intervention - 29 août 2005 à 23:16
0
Utile
Yeaha ! Un grand merci, ça marche nikel maintenant !
Petite question cepandant, le fait de mettre l'héritage en public empeche-t-il toujours l'acces au membres privés de la classe dont j'hérite ?

neodelphi
Commenter la réponse de neodelphi
cosmobob 706 Messages postés mardi 30 décembre 2003Date d'inscription 27 janvier 2009 Dernière intervention - 29 août 2005 à 23:19
0
Utile
oui ca empeche ca.

si tu veux acceder a ce genre de membre dans des classes filles, tu
dois les mettre en protected (non accessible depuis une autre classe,
mais accessible depuis des classes filles qui en dérivent de maniere
public ou protected)

a+
Commenter la réponse de cosmobob
neodelphi 442 Messages postés jeudi 4 avril 2002Date d'inscription 11 août 2008 Dernière intervention - 29 août 2005 à 23:22
0
Utile
Ok merci pour toutes ces précisions. On en aprend tout les jours sur ce language !
Pour le protected je connaissais, mais j'avai peur que le fait de mettre un héritage en public enlève les protection de l'encapsulation. Je vais pouvoir continuer a coder en toute serainité

encore merci, a+

neodelphi
Commenter la réponse de neodelphi
cosmobob 706 Messages postés mardi 30 décembre 2003Date d'inscription 27 janvier 2009 Dernière intervention - 29 août 2005 à 23:28
0
Utile
non t'inquiete pas les regles sont:

heritage public : les membres de la classe fille gardent les memes protections que ceux de la classe mère.

heritage protected: les membres de la classe mere qui sont public
deviennent protected chez la classe fille, les autres restent inchangés.

heritage private: les membres héritées deviennent tous private dans la classe fille.



a+
Commenter la réponse de cosmobob
xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention - 29 août 2005 à 23:37
0
Utile
static T* getInstance()
{
if(!psingleton)
psingleton = new T;
return psingleton;
}

ne pourrait il pas être remplacé par ....

static T * getInstance()
{
static T singleton;
return & singleton;
}

...ca simplifie un peu.
Commenter la réponse de xterminhate
cosmobob 706 Messages postés mardi 30 décembre 2003Date d'inscription 27 janvier 2009 Dernière intervention - 29 août 2005 à 23:43
0
Utile
ca simplifie sauf que tu peux pas controler quand tu veux le détruire, alors qu'avec la premiere methode, c'est possible.



a+
Commenter la réponse de cosmobob
xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention - 29 août 2005 à 23:45
0
Utile
Tu parles d'un singleton. Quand à lieu la destruction d'un singleton ? ;-)
Commenter la réponse de xterminhate
cosmobob 706 Messages postés mardi 30 décembre 2003Date d'inscription 27 janvier 2009 Dernière intervention - 29 août 2005 à 23:48
0
Utile
quand tout ce qui va avec se détruit. Singleton = au plus 1, pas tout le temps 1.

apres tout dépend de ce que tu veux faire.
Commenter la réponse de cosmobob
xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention - 29 août 2005 à 23:51
0
Utile
Tu n'as pas besoin de contrôler la destruction d'un singleton par principe, ni la construction d'ailleurs.

D'autre part, quand on fait une allocation dynamique dans un singleton, on s'arrange pour la rendre thread-safe.... dans l'état la classe singleton proposée ci dessus est inexploitable.
Commenter la réponse de xterminhate
steve_clamage 475 Messages postés dimanche 3 octobre 2004Date d'inscription 11 août 2006 Dernière intervention - 29 août 2005 à 23:55
0
Utile
Moi je ferais comme xterminhate (avec une référence)



template <typename T>

class CSingleton

{

singleton();

public:

singleton & getInstance()

{

static T singleton;

return singleton;

}



};
Commenter la réponse de steve_clamage
xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention - 29 août 2005 à 23:58
0
Utile
La meilleure solution pour faire simple et propre. The Meyer's one ;-)
Commenter la réponse de xterminhate
neodelphi 442 Messages postés jeudi 4 avril 2002Date d'inscription 11 août 2008 Dernière intervention - 30 août 2005 à 18:28
0
Utile
Je ne comprend pas l'avantage de ton code steve, peux-tu m'expliquer ?

neodelphi
Commenter la réponse de neodelphi
steve_clamage 475 Messages postés dimanche 3 octobre 2004Date d'inscription 11 août 2006 Dernière intervention - 30 août 2005 à 19:02
0
Utile
Une référence c'est un synonyme de l'instance, l'utilisation est sure et transparente.

Mon code était faux (maquait un static)



template <typename T>

class CSingleton

{

typedef T & ref;

CSingleton();

public:



static T & getInstance()

{

static T singleton;

return singleton;

}

};



class Foo

{

};



typedef CSingleton<Foo> S_Foo;



int main()

{

S_Foo::ref foo = S_Foo::getInstance();

}
Commenter la réponse de steve_clamage
xterminhate 371 Messages postés dimanche 4 janvier 2004Date d'inscription 23 septembre 2009 Dernière intervention - 30 août 2005 à 19:13
0
Utile
Pour comprendre l'interet de ce code, fait une recherche à "Meyer's Singleton".
Commenter la réponse de xterminhate

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.