class singleton [c++] - C++ - Programmation
Marsh Posté le 03-08-2004 à 09:14:30
Bien
Aucune lib n'en fournit une ?
Marsh Posté le 03-08-2004 à 10:27:56
si. merde j'ai oublié de répondre hier soir. utilise un truc genre smart pointer pour éviter tout fuite.
Marsh Posté le 03-08-2004 à 11:04:12
boost::scoped_ptr serait approprié ?
Marsh Posté le 03-08-2004 à 19:06:23
Ca permettrait de ne pas appeler explicitement un methode de destruction, c'est bien ca ?
Marsh Posté le 04-08-2004 à 12:19:50
En ré-ecrivant le membre "static auto_ptr<X> instance", est ce vraiment compatible de la foncion membre instancier() ( copie de autoptr à la ligne return instance ? ).
Marsh Posté le 04-08-2004 à 12:40:55
Au temps pour moi, j'ai forcé sur le rouge à midi!
Code :
|
Je suis pas trop sur, je maitrise pas l'auto_ptr.
Marsh Posté le 04-08-2004 à 14:14:33
vous avez vraiment le chic pour faire compliquer. ni membre statique ni rien, juste un static dans une fonction et directement initialisé.|
Marsh Posté le 04-08-2004 à 14:41:54
Code :
|
comme ca alors ?
Marsh Posté le 04-08-2004 à 14:58:24
non comme ca:
Code :
|
Tu n'as pas besoin de mettre inline a partir du moment ou la methode est implemetee dans la definition de la classe...
Marsh Posté le 04-08-2004 à 15:55:26
note que je ne sais pas dans quelle mesure c'est vrai, mais le fait d'utiliser une instance statique et no pas un pointeur peut poser de sérieux problèmes:
1. tu dois avoir une initialisation indépendante de toutes les autres données de ton système puisque tu ne peux pas présupposer de l'ordre de l'initialisation des varaiables statiques et des varaiables globales
2. dans le cas où ce code se retrouve dans une bibliothèque dynamique contenant du code C++, les objets statiques sont instanciés sans que le constructeur soit appelé si le programme appelant a été écrit/compilé en C (pb bien connu par ceux qui écrivent des extensions pour Python en C++). Dans ce cas, il vaut mieux passer par un pointeur initialisé à 0 et créer l'instance dynamiquement au premier appel.
Marsh Posté le 04-08-2004 à 16:03:54
bin dans un cas l'objet sera créé au lancement du programme, dans l'autre cas à la 1ere demande de l'objet ... je ne sais pas si c'est important ...
Marsh Posté le 04-08-2004 à 16:07:06
dans tous les cas, j'aime pas trop les singleton en C/C++, je préfère les implémentations dans les langages qui permettent les weakref, genre python, je me sens plus tranquille quand on me réclame un truc, je file une weakref et voilà
Marsh Posté le 04-08-2004 à 16:20:27
d'ailleurs j'aime bien aussi le borg-shared-state pattern
Marsh Posté le 04-08-2004 à 16:24:10
google(borg-shared-state pattern) => 'did not match any documents'. c'est quoi donc ce pattern?
Marsh Posté le 04-08-2004 à 16:26:54
BlackGoddess a écrit : bin dans un cas l'objet sera créé au lancement du programme, dans l'autre cas à la 1ere demande de l'objet ... je ne sais pas si c'est important ... |
ça peut l'être si la construction de cet objet nécessite la collaboration d'autres objets, ou dans le cas (2) que j'ai indiqué; par contre pour l'utilisateur de cette méthode peut importe.
Mais quand on choisit une implémentation plutôt qu'une autre, c'est bien de savoir pourquoi.
Marsh Posté le 04-08-2004 à 22:09:52
mynab a écrit : non comme ca:
|
Quelle simplification ! Par contre, est il tjs possible de masquer le constructeur de la classe dérivée (protected) en utilisant ce template de singleton ?
Marsh Posté le 05-08-2004 à 12:07:50
Non tu es oblige de remettre le constructeur dans la classe derivee... Sinon quelqu'un pourra construire un objet de type X. Mais tu n'as pas besoin de deriver la classe si tu n'as rien a y ajouter. Tu peux direcement appeler: singleton<int>::get() par exemple. Ou pour faire plus simple tu peux faire un typedef sur singleton<int>.
Marsh Posté le 05-08-2004 à 13:58:26
il y a un problème par contre si 2 classes utilisent singleton<int> indépendemment, en effet elles travailleraient sur la meme variable...
Marsh Posté le 05-08-2004 à 15:15:37
tu saurais ou trouver de la doc expliquant ce genre de design ?
Marsh Posté le 05-08-2004 à 15:30:05
BlackGoddess a écrit : il y a un problème par contre si 2 classes utilisent singleton<int> indépendemment, en effet elles travailleraient sur la meme variable... |
ben c'est pas le but d'un singleton?
Marsh Posté le 05-08-2004 à 15:39:32
cherche design pattern sur le forum et google
cherche factory singleton ensuite
Marsh Posté le 05-08-2004 à 18:27:46
Ce que je voulais dire...
Code :
|
ne compile pas :
In static member function `static X& singleton<X>::get() [with X = X]' `X::X()' is protected within this context... blabla.
Marsh Posté le 05-08-2004 à 21:01:05
Ok. Mais, ajouter friend singleton<X> dans la déclaration de X est un peu contraignant.
Marsh Posté le 05-08-2004 à 21:02:16
xterminhate a écrit : Ok. Mais, ajouter friend singleton<X> dans la déclaration de X est un peu contraignant. |
non c'est le contraire
Code :
|
Marsh Posté le 05-08-2004 à 21:09:33
ben ça sert à rien ça, puisque X a déjà accès
friend class singleton<X> est ok
à toi de savoir ce que tu fais
Marsh Posté le 05-08-2004 à 21:10:12
schnapsmann a écrit : non c'est le contraire
|
Etonnant, tu as quel compilateur ?
Marsh Posté le 05-08-2004 à 21:11:55
merde je voyais private et non protected là
Marsh Posté le 05-08-2004 à 22:36:03
xterminhate a écrit : Ce que je voulais dire...
|
Ben c'est normal... je ne comprends pas trop ce que tu veux faire avec l'appel que tu fais dans le main...
X derive de singleton<> et est donc un singleton. Tu essaies donc de creer une deuxieme instance x de ton singleton. C'est normal que ca ne compile pas puisque en faisant un singleton c'est justement de que tu demandes au compilo: t'interdire de creer plusieurs instances de ton singleton!
Si tu veux creer un singleton sur la classe X alors il faut faire:
Code :
|
et apres tu accedes a singleton<X> et voila!
Marsh Posté le 06-08-2004 à 07:29:12
mynab a écrit : Ben c'est normal... je ne comprends pas trop ce que tu veux faire avec l'appel que tu fais dans le main... |
Dans le main, je souhaite acceder à l'instance unique de mon singleton de X. C'est un cas d'utilisation parmi tant d'autres. Le but etait bien de faire un modèle de singleton utilisable.
A mon sens, le rôle de singleton<X>::get() est de retourner une référence unique. Donc l'appel dans le main, ne multiplie pas les instances de mon singleton de X! Corriges moi si je fais une erreur.
D'ailleurs, appeler x::get ou singleton<x>::get revient au même.
Code :
|
mynab a écrit : |
Non. Je ne vois pas ce qui est normal. Comment arriverais tu à utiliser le modèle que tu m as donné sans ajouter le friend ?
Merci.
Marsh Posté le 14-11-2004 à 18:30:22
Voila mon singleton, dites moi ce que vous en pensez:
Code :
|
Et un exemple d'utilisation de la classe:
Code :
|
J'ai compile avec la ligne suivante:
g++ -g -ansi -Wall -pedantic main.cpp
Et valgrind me dit:
|
Et si je n'utilise pas auto_ptr (le code en commentaire), valgrind me dit:
|
Marsh Posté le 14-11-2004 à 20:53:04
Ce modèle ci ne convenait pas ?
Code :
|
Marsh Posté le 02-08-2004 à 18:00:30
Je decouvre qu'il existait une classe de base pour faire un singleton, je croyais que c'etait pas possible... à cause en particulier du static instance.
La classe est semble t il incomplete, mais ca donne une idée.
Message édité par xterminhate le 04-08-2004 à 12:16:23
---------------
Cordialement, Xterm-in'Hate...