je commence à écrire une petite application "à but didactif" pour
essayer de progresser un peu en c++
après avoir lu les threads sur vars globales, j'ai placé toutes les
prefs utilisateur dans une classe PrefsManager qui hérite d'une
classe Singleton.
PrefsManager stocke une multitude de variables privées, les initialise
à partir d'un fichier ini (multiples readIni()) et les y sauvegarde
(multiples writeIni()) + toutes les méthodes GetMavar() SetMavar()
qui vont bien et qui alourdissent l'accès aux variables.
bref je suis immédiatement tenté de retomber dans le bidouillage
pour allèger le tout :-(
Pouvez-vous me dire si les constructions suivantes sont "passables",
à éviter, proscrire... les problèmes (maintenance ou autre) qui
peuvent apparaître en les utilisant
1) une instance globale de PrefsManager et accèder au variables :
3) un enum en plus et des tableaux de valeurs pour les prefs dans
PrefsManager, pour permettre également des itérations pour
l'initialisation et la sauvegarde des préférences
int PrefsManager::GetPref(int idx) {return prefs_int[idx];}
bool PrefsManager::GetPref(int idx) {return prefs_bool[idx];}
4) Autre chose qui ferait ça bien mieux ?
5) static PrefsManager *PrefsMgr;
#define GetThePref(x) PrefsMgr->GetPref(\"#x\")
avec prefs stockées dans hash maps du PrefsManager
(parceque pour débugger c'est plus rigolo ;-)))
Quand, exactement ? N'y a-t-il pas le risque que la fonction soit appelée après la destruction de l'objet ?
-- ;-)
Loïc Joly
On Sun, 13 Mar 2005 09:46:56 +0100, Loïc Joly :
l'objet est détruit à la fin du programme
Quand, exactement ? N'y a-t-il pas le risque que la fonction soit appelée après la destruction de l'objet ?
Ca doit être possible, à condition d'avoir une variable globale d'un type ne faisant pas apper à instance() pendant sa construction, mais y faisant appel pendant sa destruction.
Si ces conditions ne sont pas remplies, alors ta solution convient mieux à la situation.
-- Loïc
On Sun, 13 Mar 2005 09:46:56 +0100, Loïc Joly
<loic.actarus.joly@wanadoo.fr>:
l'objet est détruit à la fin du programme
Quand, exactement ?
N'y a-t-il pas le risque que la fonction soit appelée après la
destruction de l'objet ?
Ca doit être possible, à condition d'avoir une variable globale d'un
type ne faisant pas apper à instance() pendant sa construction, mais y
faisant appel pendant sa destruction.
Si ces conditions ne sont pas remplies, alors ta solution convient mieux
à la situation.
Quand, exactement ? N'y a-t-il pas le risque que la fonction soit appelée après la destruction de l'objet ?
Ca doit être possible, à condition d'avoir une variable globale d'un type ne faisant pas apper à instance() pendant sa construction, mais y faisant appel pendant sa destruction.
Si ces conditions ne sont pas remplies, alors ta solution convient mieux à la situation.
-- Loïc
Arnaud Debaene
Fabien LE LEZ wrote:
On Sun, 13 Mar 2005 09:46:56 +0100, Loïc Joly :
l'objet est détruit à la fin du programme
Quand, exactement ? A la fin du programme, après le retour du main. Les objets à durée de vie
statique sont alors détruit dans l'ordre inverse de leur création (sachant que cet objet est créé lors du 1er appel à la méthode instance).
N'y a-t-il pas le risque que la fonction soit appelée après la destruction de l'objet ? On peut imaginer un problème si on appelle cette méthode dans le destructeur
d'un autre objet à durée de vie statique qui serait détruit après celui-ci : un cas quand même assez tordu. Il y a également peut-être un problème si on fait mu-muse avec atexit, mais je n'en suis pas sûr.
Arnaud
Fabien LE LEZ wrote:
On Sun, 13 Mar 2005 09:46:56 +0100, Loïc Joly
<loic.actarus.joly@wanadoo.fr>:
l'objet est détruit à la fin du programme
Quand, exactement ?
A la fin du programme, après le retour du main. Les objets à durée de vie
statique sont alors détruit dans l'ordre inverse de leur création (sachant
que cet objet est créé lors du 1er appel à la méthode instance).
N'y a-t-il pas le risque que la fonction soit appelée après la
destruction de l'objet ?
On peut imaginer un problème si on appelle cette méthode dans le destructeur
d'un autre objet à durée de vie statique qui serait détruit après celui-ci :
un cas quand même assez tordu. Il y a également peut-être un problème si on
fait mu-muse avec atexit, mais je n'en suis pas sûr.
Quand, exactement ? A la fin du programme, après le retour du main. Les objets à durée de vie
statique sont alors détruit dans l'ordre inverse de leur création (sachant que cet objet est créé lors du 1er appel à la méthode instance).
N'y a-t-il pas le risque que la fonction soit appelée après la destruction de l'objet ? On peut imaginer un problème si on appelle cette méthode dans le destructeur
d'un autre objet à durée de vie statique qui serait détruit après celui-ci : un cas quand même assez tordu. Il y a également peut-être un problème si on fait mu-muse avec atexit, mais je n'en suis pas sûr.
Arnaud
tibug
[code pour une classe Singleton]
Merci à vous, en fait j'ai déjà ma classe Singleton (template) et une classe PrefsManager qui en hérite. J'ai mis le code à la fin du message plus bas si ça peut servir à d'autres débutants.
pour l'instant j'en suis à la phase 0 des petits tests préalables... bloqué au chapitre 0 de "comment gérer les prefs globales facilement" :(
j'ai quelques idées qui fonctionnent (compilent) mais je ne sais pas si ça tient de la bidouille (ou hypotétiquement si c'est des constructions "passables" -- j'aimerais faire "propre" puisque j'écris cette app pour apprendre) d'où mon précédent message.
je vais essayer de préciser un peu (pour les gens pressés, aller directement au 3 :)
1) dans un premier temps, je voudrai alléger l'accès l'écriture des accès aux variables du PrefsManager dans tout le programme, c'est à dire éviter d'écrire partout :
PrefsManager *pmgr; int truc = pmgr->GetPrefTruc(); // un GetPref...() par var
mais plutôt, n'avoir à écrire que :
int truc = TRUC; // TRUC: sorte de variable en "lecture seule" (mais pas constante) // que seule une classe héritant de PrefManager peut modifier // (ce qui permet de se passer de tous les ->SetTruc(valeur))
après avoir défini quelque chose qui fasse la même que ce qui suit (mais en plus "propre" donc) :
int monAppPrefs::nsGetPrefTruc() { return m_PrefsMgr->GetPrefTruc(); }
2) (et/ou) essayer de généraliser la forme des accès aux variables en utilisant des méthodes "génériques" et un container dans PrefManager qui me permette d'itérer lors de l'initialisation et la sauvegarde des préférences utilisateur :
=> la solution ci-dessous me semble bien trop coûteuse en CPU à cause des itérations à chaque accès à une préférence
-- monAppPrefs.h -------
namespace monAppPrefs { static PrefsManager *m_PrefsMgr; int nsGetIntPref(const std::string& str); bool nsGetBoolPref(const std::string& str); ... // une méthode par type de pref }
int monAppPrefs::nsGetIntPref(const std::string& str) { return m_PrefsMgr->GetIntPref(str); } -------
et dans et dans PrefsManager des containers style hash_map (un par type de pref aussi) pour bien faire ramer le tout ;-(
int PrefsManager::GetIntPref(const std::string& str) { return m_hmiPref(str); // retourne l'int associé à str }
int PrefsManager::GetBoolPref(const std::string& str) { return m_hmbPref(str); // retourne le booléen associé à str }
3)
Au final j'aimerai trouver une solution pour que lorsque j'ajoute/retire une variable à PrefManager, il suffise de modifier uniquement les #define.
Exemple (le premier qui me vient): un jour lointain j'ajoute un "SkinManager" aussi de type Singleton à qui je délègue la (pseudo) variable "truc" et je fixe "machin" :
namespace monAppNS { // pas sûr de la syntaxe namespace monAppPrefs {...} } // en donnant spécifaint une valeur par défaut 100 pour "truc" #define TRUC monAppNS::monAppPrefs::nsGetIntPref("truc",100) #define MACHIN monAppNS::monAppPrefs::nsGetIntPref("machin",true)
class PrefsManager : public Singleton<PrefsManager> {
friend class Singleton<PrefsManager>;
private :
bool m_pInitialised; int m_iTruc; // UNMAX de préférences untilisateur ici :-(
PrefsManager(); ~PrefsManager();
//... un ReadIni/WriteIni par type (en fait heritees de IniFile) int ReadIni(const std::string& key, int valDef); int WrtiteIni(const std::string& key, int newVal); bool ReadIni(const std::string& key, bool valDef); bool WrtiteIni(const std::string& key, bool newVal);
public : // tous les couples set/get void SetPrefTruc(int val); int GetPrefTruc(); };
bool PrefsManager::Initialise() { // initialise toutes les variables en les lisant dans un // fichier ini (ou avec une valeur par defaut si absente) // UNMAXDE appels a ReadIni("maVar", valDefault) ici :-(( return res; // résultat de l'initialisation }
int PrefsManager::SaveAllPrefs() { // sauve toutes les prefs dans un fichier ini // UNMAXDE appels à WriteIni("maVar", valUser) ici :-(( return res; // résultat de la sauvegarde }
// UNMAXDE de GetPrefMachin int PrefsManager::GetPrefTruc() { return m_iTruc; }
// et pour finir UNMAXDE de SetPrefMachin (eventuellement) void PrefsManager::SetPrefTruc(int newVal) { m_iTruc = newVal; }
// Methodes pour lire/ecrire dans le fichier prefs.ini
int PrefsManager::ReadIni(const std::string& key, int valDef) {...} bool PrefsManager::ReadIni(const std::string& key, bool valDef) {...} //...
int PrefsManager::WrtiteIni(const std::string& key, int newVal) {...} bool PrefsManager::WrtiteIni(const std::string& key, bool newVal) {...} //...
[code pour une classe Singleton]
Merci à vous, en fait j'ai déjà ma classe Singleton (template) et une
classe PrefsManager qui en hérite. J'ai mis le code à la fin du message
plus bas si ça peut servir à d'autres débutants.
pour l'instant j'en suis à la phase 0 des petits tests préalables...
bloqué au chapitre 0 de "comment gérer les prefs globales facilement" :(
j'ai quelques idées qui fonctionnent (compilent) mais je ne sais pas si
ça tient de la bidouille (ou hypotétiquement si c'est des constructions
"passables" -- j'aimerais faire "propre" puisque j'écris cette app pour
apprendre) d'où mon précédent message.
je vais essayer de préciser un peu (pour les gens pressés, aller
directement au 3 :)
1) dans un premier temps, je voudrai alléger l'accès l'écriture des
accès aux variables du PrefsManager dans tout le programme, c'est à
dire éviter d'écrire partout :
PrefsManager *pmgr;
int truc = pmgr->GetPrefTruc(); // un GetPref...() par var
mais plutôt, n'avoir à écrire que :
int truc = TRUC;
// TRUC: sorte de variable en "lecture seule" (mais pas constante)
// que seule une classe héritant de PrefManager peut modifier
// (ce qui permet de se passer de tous les ->SetTruc(valeur))
après avoir défini quelque chose qui fasse la même que ce qui suit
(mais en plus "propre" donc) :
int monAppPrefs::nsGetPrefTruc() {
return m_PrefsMgr->GetPrefTruc();
}
2) (et/ou) essayer de généraliser la forme des accès aux variables
en utilisant des méthodes "génériques" et un container dans
PrefManager qui me permette d'itérer lors de l'initialisation
et la sauvegarde des préférences utilisateur :
=> la solution ci-dessous me semble bien trop coûteuse en CPU
à cause des itérations à chaque accès à une préférence
-- monAppPrefs.h -------
namespace monAppPrefs {
static PrefsManager *m_PrefsMgr;
int nsGetIntPref(const std::string& str);
bool nsGetBoolPref(const std::string& str);
... // une méthode par type de pref
}
int monAppPrefs::nsGetIntPref(const std::string& str) {
return m_PrefsMgr->GetIntPref(str);
}
-------
et dans et dans PrefsManager des containers style hash_map
(un par type de pref aussi) pour bien faire ramer le tout ;-(
int PrefsManager::GetIntPref(const std::string& str) {
return m_hmiPref(str); // retourne l'int associé à str
}
int PrefsManager::GetBoolPref(const std::string& str) {
return m_hmbPref(str); // retourne le booléen associé à str
}
3)
Au final j'aimerai trouver une solution pour que lorsque
j'ajoute/retire une variable à PrefManager, il suffise de
modifier uniquement les #define.
Exemple (le premier qui me vient): un jour lointain j'ajoute
un "SkinManager" aussi de type Singleton à qui je délègue
la (pseudo) variable "truc" et je fixe "machin" :
namespace monAppNS { // pas sûr de la syntaxe
namespace monAppPrefs {...}
}
// en donnant spécifaint une valeur par défaut 100 pour "truc"
#define TRUC monAppNS::monAppPrefs::nsGetIntPref("truc",100)
#define MACHIN monAppNS::monAppPrefs::nsGetIntPref("machin",true)
class PrefsManager : public Singleton<PrefsManager> {
friend class Singleton<PrefsManager>;
private :
bool m_pInitialised;
int m_iTruc;
// UNMAX de préférences untilisateur ici :-(
PrefsManager();
~PrefsManager();
//... un ReadIni/WriteIni par type (en fait heritees de IniFile)
int ReadIni(const std::string& key, int valDef);
int WrtiteIni(const std::string& key, int newVal);
bool ReadIni(const std::string& key, bool valDef);
bool WrtiteIni(const std::string& key, bool newVal);
public :
// tous les couples set/get
void SetPrefTruc(int val);
int GetPrefTruc();
};
bool PrefsManager::Initialise() {
// initialise toutes les variables en les lisant dans un
// fichier ini (ou avec une valeur par defaut si absente)
// UNMAXDE appels a ReadIni("maVar", valDefault) ici :-((
return res; // résultat de l'initialisation
}
int PrefsManager::SaveAllPrefs() {
// sauve toutes les prefs dans un fichier ini
// UNMAXDE appels à WriteIni("maVar", valUser) ici :-((
return res; // résultat de la sauvegarde
}
// UNMAXDE de GetPrefMachin
int PrefsManager::GetPrefTruc() { return m_iTruc; }
// et pour finir UNMAXDE de SetPrefMachin (eventuellement)
void PrefsManager::SetPrefTruc(int newVal) { m_iTruc = newVal; }
// Methodes pour lire/ecrire dans le fichier prefs.ini
int PrefsManager::ReadIni(const std::string& key, int valDef) {...}
bool PrefsManager::ReadIni(const std::string& key, bool valDef) {...}
//...
int PrefsManager::WrtiteIni(const std::string& key, int newVal) {...}
bool PrefsManager::WrtiteIni(const std::string& key, bool newVal) {...}
//...
Merci à vous, en fait j'ai déjà ma classe Singleton (template) et une classe PrefsManager qui en hérite. J'ai mis le code à la fin du message plus bas si ça peut servir à d'autres débutants.
pour l'instant j'en suis à la phase 0 des petits tests préalables... bloqué au chapitre 0 de "comment gérer les prefs globales facilement" :(
j'ai quelques idées qui fonctionnent (compilent) mais je ne sais pas si ça tient de la bidouille (ou hypotétiquement si c'est des constructions "passables" -- j'aimerais faire "propre" puisque j'écris cette app pour apprendre) d'où mon précédent message.
je vais essayer de préciser un peu (pour les gens pressés, aller directement au 3 :)
1) dans un premier temps, je voudrai alléger l'accès l'écriture des accès aux variables du PrefsManager dans tout le programme, c'est à dire éviter d'écrire partout :
PrefsManager *pmgr; int truc = pmgr->GetPrefTruc(); // un GetPref...() par var
mais plutôt, n'avoir à écrire que :
int truc = TRUC; // TRUC: sorte de variable en "lecture seule" (mais pas constante) // que seule une classe héritant de PrefManager peut modifier // (ce qui permet de se passer de tous les ->SetTruc(valeur))
après avoir défini quelque chose qui fasse la même que ce qui suit (mais en plus "propre" donc) :
int monAppPrefs::nsGetPrefTruc() { return m_PrefsMgr->GetPrefTruc(); }
2) (et/ou) essayer de généraliser la forme des accès aux variables en utilisant des méthodes "génériques" et un container dans PrefManager qui me permette d'itérer lors de l'initialisation et la sauvegarde des préférences utilisateur :
=> la solution ci-dessous me semble bien trop coûteuse en CPU à cause des itérations à chaque accès à une préférence
-- monAppPrefs.h -------
namespace monAppPrefs { static PrefsManager *m_PrefsMgr; int nsGetIntPref(const std::string& str); bool nsGetBoolPref(const std::string& str); ... // une méthode par type de pref }
int monAppPrefs::nsGetIntPref(const std::string& str) { return m_PrefsMgr->GetIntPref(str); } -------
et dans et dans PrefsManager des containers style hash_map (un par type de pref aussi) pour bien faire ramer le tout ;-(
int PrefsManager::GetIntPref(const std::string& str) { return m_hmiPref(str); // retourne l'int associé à str }
int PrefsManager::GetBoolPref(const std::string& str) { return m_hmbPref(str); // retourne le booléen associé à str }
3)
Au final j'aimerai trouver une solution pour que lorsque j'ajoute/retire une variable à PrefManager, il suffise de modifier uniquement les #define.
Exemple (le premier qui me vient): un jour lointain j'ajoute un "SkinManager" aussi de type Singleton à qui je délègue la (pseudo) variable "truc" et je fixe "machin" :
namespace monAppNS { // pas sûr de la syntaxe namespace monAppPrefs {...} } // en donnant spécifaint une valeur par défaut 100 pour "truc" #define TRUC monAppNS::monAppPrefs::nsGetIntPref("truc",100) #define MACHIN monAppNS::monAppPrefs::nsGetIntPref("machin",true)
class PrefsManager : public Singleton<PrefsManager> {
friend class Singleton<PrefsManager>;
private :
bool m_pInitialised; int m_iTruc; // UNMAX de préférences untilisateur ici :-(
PrefsManager(); ~PrefsManager();
//... un ReadIni/WriteIni par type (en fait heritees de IniFile) int ReadIni(const std::string& key, int valDef); int WrtiteIni(const std::string& key, int newVal); bool ReadIni(const std::string& key, bool valDef); bool WrtiteIni(const std::string& key, bool newVal);
public : // tous les couples set/get void SetPrefTruc(int val); int GetPrefTruc(); };
bool PrefsManager::Initialise() { // initialise toutes les variables en les lisant dans un // fichier ini (ou avec une valeur par defaut si absente) // UNMAXDE appels a ReadIni("maVar", valDefault) ici :-(( return res; // résultat de l'initialisation }
int PrefsManager::SaveAllPrefs() { // sauve toutes les prefs dans un fichier ini // UNMAXDE appels à WriteIni("maVar", valUser) ici :-(( return res; // résultat de la sauvegarde }
// UNMAXDE de GetPrefMachin int PrefsManager::GetPrefTruc() { return m_iTruc; }
// et pour finir UNMAXDE de SetPrefMachin (eventuellement) void PrefsManager::SetPrefTruc(int newVal) { m_iTruc = newVal; }
// Methodes pour lire/ecrire dans le fichier prefs.ini
int PrefsManager::ReadIni(const std::string& key, int valDef) {...} bool PrefsManager::ReadIni(const std::string& key, bool valDef) {...} //...
int PrefsManager::WrtiteIni(const std::string& key, int newVal) {...} bool PrefsManager::WrtiteIni(const std::string& key, bool newVal) {...} //...
Fabien LE LEZ
On Sun, 13 Mar 2005 13:27:38 +0100, tibug <tibug29_AROBASE_yahoo_fr>:
mais plutôt, n'avoir à écrire que :
int truc = TRUC;
Je te propose, dans mon message de ce matin,
int truc= Truc();
Deux caractères de plus que ce que tu espères, mais c'est déjà ça...
-- ;-)
On Sun, 13 Mar 2005 13:27:38 +0100, tibug <tibug29_AROBASE_yahoo_fr>:
mais plutôt, n'avoir à écrire que :
int truc = TRUC;
Je te propose, dans mon message de ce matin,
int truc= Truc();
Deux caractères de plus que ce que tu espères, mais c'est déjà ça...
On Sun, 13 Mar 2005 13:27:38 +0100, tibug <tibug29_AROBASE_yahoo_fr>:
mais plutôt, n'avoir à écrire que :
int truc = TRUC;
Je te propose, dans mon message de ce matin,
int truc= Truc();
Deux caractères de plus que ce que tu espères, mais c'est déjà ça...
-- ;-)
Samuel Krempp
le Sunday 13 March 2005 15:49, écrivit :
On Sun, 13 Mar 2005 13:27:38 +0100, tibug <tibug29_AROBASE_yahoo_fr>:
mais plutôt, n'avoir à écrire que :
int truc = TRUC;
Je te propose, dans mon message de ce matin,
int truc= Truc();
Deux caractères de plus que ce que tu espères, mais c'est déjà ça...
en fait, 7 caracs de moins : Truc(); ;-)
à priori je ne dupliquerais la var globale en une locale que si le nom est vraiment long et qu'elle vas servir 10 fois ou +, ou encore que je vais faire des modifs dessus, etc..
-- Sam
le Sunday 13 March 2005 15:49, gramster@gramster.com écrivit :
On Sun, 13 Mar 2005 13:27:38 +0100, tibug <tibug29_AROBASE_yahoo_fr>:
mais plutôt, n'avoir à écrire que :
int truc = TRUC;
Je te propose, dans mon message de ce matin,
int truc= Truc();
Deux caractères de plus que ce que tu espères, mais c'est déjà ça...
en fait, 7 caracs de moins :
Truc();
;-)
à priori je ne dupliquerais la var globale en une locale que si le nom est
vraiment long et qu'elle vas servir 10 fois ou +, ou encore que je vais
faire des modifs dessus, etc..
On Sun, 13 Mar 2005 13:27:38 +0100, tibug <tibug29_AROBASE_yahoo_fr>:
mais plutôt, n'avoir à écrire que :
int truc = TRUC;
Je te propose, dans mon message de ce matin,
int truc= Truc();
Deux caractères de plus que ce que tu espères, mais c'est déjà ça...
en fait, 7 caracs de moins : Truc(); ;-)
à priori je ne dupliquerais la var globale en une locale que si le nom est vraiment long et qu'elle vas servir 10 fois ou +, ou encore que je vais faire des modifs dessus, etc..
-- Sam
Samuel Krempp
le Sunday 13 March 2005 09:46, écrivit :
C'est UNE méthode classique. Une autre existe qui est aussi assez utilisée (plus simple à écrire, l'objet est détruit à la fin du programme)
j'aime assez ce système, je l'utilise bcp.
Dans l'optique de constantes et variables globales, je trouve qu'un namespace est plus pratique qu'une classe pour permettre un accès rapide là où on les utilise intensivement.
void foo() { using namespace MesConstantes; double x = vitesseDuVent() * exp(ageDuCapitaine()/20.0); vitesseDuVent() = x / 2; ...
mais bon, je suis pas certain du genre de "Prefs" dont il est question et si ce genre de namespace s'y preterait, j'ai eu la flemme de lire en entier les messages du O.P..
-- Sam
le Sunday 13 March 2005 09:46, loic.actarus.joly@wanadoo.fr écrivit :
C'est UNE méthode classique. Une autre existe qui est aussi assez
utilisée (plus simple à écrire, l'objet est détruit à la fin du programme)
j'aime assez ce système, je l'utilise bcp.
Dans l'optique de constantes et variables globales, je trouve qu'un
namespace est plus pratique qu'une classe pour permettre un accès rapide là
où on les utilise intensivement.
void foo() {
using namespace MesConstantes;
double x = vitesseDuVent() * exp(ageDuCapitaine()/20.0);
vitesseDuVent() = x / 2;
...
mais bon, je suis pas certain du genre de "Prefs" dont il est question et si
ce genre de namespace s'y preterait, j'ai eu la flemme de lire en entier
les messages du O.P..
C'est UNE méthode classique. Une autre existe qui est aussi assez utilisée (plus simple à écrire, l'objet est détruit à la fin du programme)
j'aime assez ce système, je l'utilise bcp.
Dans l'optique de constantes et variables globales, je trouve qu'un namespace est plus pratique qu'une classe pour permettre un accès rapide là où on les utilise intensivement.
void foo() { using namespace MesConstantes; double x = vitesseDuVent() * exp(ageDuCapitaine()/20.0); vitesseDuVent() = x / 2; ...
mais bon, je suis pas certain du genre de "Prefs" dont il est question et si ce genre de namespace s'y preterait, j'ai eu la flemme de lire en entier les messages du O.P..
-- Sam
tibug
Bonjour,
le Sunday 13 March 2005 15:49, écrivit :
Je te propose, dans mon message de ce matin,
int truc= Truc();
Deux caractères de plus que ce que tu espères, mais c'est déjà ça...
bah oui, ton message était pourtant bien clair, il va juste falloir que je réapprenne à lire ;-( mea culpa
à priori je ne dupliquerais la var globale en une locale que si le nom est vraiment long et qu'elle vas servir 10 fois ou +, ou encore que je vais faire des modifs dessus, etc.. [+ réponse avec namespace]
Oui, en fait je compte regrouper ce genre de variables dans un namespace+singleton pour y accèder lors de l'initialisation / mise à jour et utiliser des copies locales dans les objets les utilisant. (en fait le singleton charge/décharge/recharge les données à la demande)
Pour mon histoire de variable globales en lecture seule j'en suis là: [cf. autre post "namespaces et importation de classes/namespaces"]
- Une classe PrefsServer sur modèle singleton : elle contient toutes les variables en 'protected' et les méthodes publiques 'Gets()' associées.
- Une classe PrefsManager ('PrefsServer friendly') qui peut modifier les variables protegées de PrefsServer (utilisée par exemple pour une boîte de dialogue pour modifier les prefs).
using AutreNamespace; // je voudrais l'importer tout en le rendant // "privé" sans avoir à l'implémenter ici et // qu'on ne puisse donc pas y accèder // autrement que par MyApp::AutreNamespace::...
class A {...}; // idem, (les tests avec extern)
int GetPrefsB() { return PrefsServer::GetInstance()->GetPrefsB(); }; }
A+
tibug
Bonjour,
le Sunday 13 March 2005 15:49, gramster@gramster.com écrivit :
Je te propose, dans mon message de ce matin,
int truc= Truc();
Deux caractères de plus que ce que tu espères, mais c'est déjà ça...
bah oui, ton message était pourtant bien clair, il va juste falloir que
je réapprenne à lire ;-( mea culpa
à priori je ne dupliquerais la var globale en une locale que si le nom est
vraiment long et qu'elle vas servir 10 fois ou +, ou encore que je vais
faire des modifs dessus, etc..
[+ réponse avec namespace]
Oui, en fait je compte regrouper ce genre de variables dans un
namespace+singleton pour y accèder lors de l'initialisation / mise à
jour et utiliser des copies locales dans les objets les utilisant.
(en fait le singleton charge/décharge/recharge les données à la demande)
Pour mon histoire de variable globales en lecture seule j'en suis là:
[cf. autre post "namespaces et importation de classes/namespaces"]
- Une classe PrefsServer sur modèle singleton : elle contient toutes les
variables en 'protected' et les méthodes publiques 'Gets()' associées.
- Une classe PrefsManager ('PrefsServer friendly') qui peut modifier les
variables protegées de PrefsServer (utilisée par exemple pour une
boîte de dialogue pour modifier les prefs).
using AutreNamespace; // je voudrais l'importer tout en le rendant
// "privé" sans avoir à l'implémenter ici et
// qu'on ne puisse donc pas y accèder
// autrement que par MyApp::AutreNamespace::...
class A {...}; // idem, (les tests avec extern)
int GetPrefsB() { return PrefsServer::GetInstance()->GetPrefsB(); };
}
Deux caractères de plus que ce que tu espères, mais c'est déjà ça...
bah oui, ton message était pourtant bien clair, il va juste falloir que je réapprenne à lire ;-( mea culpa
à priori je ne dupliquerais la var globale en une locale que si le nom est vraiment long et qu'elle vas servir 10 fois ou +, ou encore que je vais faire des modifs dessus, etc.. [+ réponse avec namespace]
Oui, en fait je compte regrouper ce genre de variables dans un namespace+singleton pour y accèder lors de l'initialisation / mise à jour et utiliser des copies locales dans les objets les utilisant. (en fait le singleton charge/décharge/recharge les données à la demande)
Pour mon histoire de variable globales en lecture seule j'en suis là: [cf. autre post "namespaces et importation de classes/namespaces"]
- Une classe PrefsServer sur modèle singleton : elle contient toutes les variables en 'protected' et les méthodes publiques 'Gets()' associées.
- Une classe PrefsManager ('PrefsServer friendly') qui peut modifier les variables protegées de PrefsServer (utilisée par exemple pour une boîte de dialogue pour modifier les prefs).
using AutreNamespace; // je voudrais l'importer tout en le rendant // "privé" sans avoir à l'implémenter ici et // qu'on ne puisse donc pas y accèder // autrement que par MyApp::AutreNamespace::...
class A {...}; // idem, (les tests avec extern)
int GetPrefsB() { return PrefsServer::GetInstance()->GetPrefsB(); }; }