Le Fri, 06 May 2005 12:03:28 +0200, Bruno CAUSSE a écrit :
Existe t'il un moyen d'initialiser une classe avant sa 1er utilistion. Genre les initialiseurs static de java.
Il n'y a pas d'équivalent, à ma connaissance, des initialisateurs statiques, dans C++. Deux solutions me viennent, peu élégantes néanmoins, les deux faisant intervenir une méthode statique qui fait le travail d'initialisation :
- appeler cette méthode au début du programme, a la mano, - mettre dans la classe un flag dénotant le passage par cette méthode, et s'en servir pour l'appeler au premier appel d'un constructeur.
Par curiosité, où se sert-on d'initialisateurs statiques ?
Incomplètement, Nowhere man --
OpenPGP 0xD9D50D8A
Le Fri, 06 May 2005 12:03:28 +0200, Bruno CAUSSE a écrit :
Existe t'il un moyen d'initialiser une classe avant sa 1er utilistion.
Genre les initialiseurs static de java.
Il n'y a pas d'équivalent, à ma connaissance, des initialisateurs
statiques, dans C++. Deux solutions me viennent, peu élégantes
néanmoins, les deux faisant intervenir une méthode statique qui fait le
travail d'initialisation :
- appeler cette méthode au début du programme, a la mano,
- mettre dans la classe un flag dénotant le passage par cette méthode,
et s'en servir pour l'appeler au premier appel d'un constructeur.
Par curiosité, où se sert-on d'initialisateurs statiques ?
Incomplètement,
Nowhere man
--
nowhere.man@levallois.eu.org
OpenPGP 0xD9D50D8A
Le Fri, 06 May 2005 12:03:28 +0200, Bruno CAUSSE a écrit :
Existe t'il un moyen d'initialiser une classe avant sa 1er utilistion. Genre les initialiseurs static de java.
Il n'y a pas d'équivalent, à ma connaissance, des initialisateurs statiques, dans C++. Deux solutions me viennent, peu élégantes néanmoins, les deux faisant intervenir une méthode statique qui fait le travail d'initialisation :
- appeler cette méthode au début du programme, a la mano, - mettre dans la classe un flag dénotant le passage par cette méthode, et s'en servir pour l'appeler au premier appel d'un constructeur.
Par curiosité, où se sert-on d'initialisateurs statiques ?
Incomplètement, Nowhere man --
OpenPGP 0xD9D50D8A
pasde.bcausse.spam
Pierre THIERRY wrote:
Par curiosité, où se sert-on d'initialisateurs statiques ?
un ex au hasard : charger des données utilent a la classe sans aucun appel prealable. l'utilisateur de la classe n'a pas a faire Classe.init() ou Classe.load() avant d'utiliser la classe.
-- Bruno Causse http://perso.wanadoo.fr/othello
Pierre THIERRY <nowhere.man@levallois.eu.org> wrote:
Par curiosité, où se sert-on d'initialisateurs statiques ?
un ex au hasard : charger des données utilent a la classe sans aucun
appel prealable. l'utilisateur de la classe n'a pas a faire
Classe.init() ou Classe.load() avant d'utiliser la classe.
Par curiosité, où se sert-on d'initialisateurs statiques ?
un ex au hasard : charger des données utilent a la classe sans aucun appel prealable. l'utilisateur de la classe n'a pas a faire Classe.init() ou Classe.load() avant d'utiliser la classe.
-- Bruno Causse http://perso.wanadoo.fr/othello
bernard tatin
Pierre THIERRY wrote:
Par curiosité, où se sert-on d'initialisateurs statiques ?
un ex au hasard : charger des données utilent a la classe sans aucun appel prealable. l'utilisateur de la classe n'a pas a faire Classe.init() ou Classe.load() avant d'utiliser la classe.
Un singleton?
Les constructeurs sont privés à la classe et une méthode statique de la classe permet de récupérer la variable globale (statique et privée de la classe). Exemple :
La définition de la classe (config.h): class Config { private: Config(); static Config* mainConfig; public: static Config* getConfig(); string getConfigName(); };
Les variables statiques et les méthodes (config.cpp) Config* Config::mainConfig = 0; Config::Config() { ... } Config* Config::getConfig() { if (mainConfig == 0) mainConfig = new Config(); return mainConfig; }
....
Dans le main.cpp : Config *superMainConfig = Config::getConfig();
int main () { if (superMainConfig->getConfigName() == "coucou") ... }
Est-ce que ça répond à la question ?
Bernard.
Pierre THIERRY <nowhere.man@levallois.eu.org> wrote:
Par curiosité, où se sert-on d'initialisateurs statiques ?
un ex au hasard : charger des données utilent a la classe sans aucun
appel prealable. l'utilisateur de la classe n'a pas a faire
Classe.init() ou Classe.load() avant d'utiliser la classe.
Un singleton?
Les constructeurs sont privés à la classe et une méthode statique de la
classe permet de récupérer la variable globale (statique et privée de la
classe). Exemple :
La définition de la classe (config.h):
class Config {
private:
Config();
static Config* mainConfig;
public:
static Config* getConfig();
string getConfigName();
};
Les variables statiques et les méthodes (config.cpp)
Config* Config::mainConfig = 0;
Config::Config() {
...
}
Config* Config::getConfig() {
if (mainConfig == 0)
mainConfig = new Config();
return mainConfig;
}
....
Dans le main.cpp :
Config *superMainConfig = Config::getConfig();
int main () {
if (superMainConfig->getConfigName() == "coucou")
...
}
Par curiosité, où se sert-on d'initialisateurs statiques ?
un ex au hasard : charger des données utilent a la classe sans aucun appel prealable. l'utilisateur de la classe n'a pas a faire Classe.init() ou Classe.load() avant d'utiliser la classe.
Un singleton?
Les constructeurs sont privés à la classe et une méthode statique de la classe permet de récupérer la variable globale (statique et privée de la classe). Exemple :
La définition de la classe (config.h): class Config { private: Config(); static Config* mainConfig; public: static Config* getConfig(); string getConfigName(); };
Les variables statiques et les méthodes (config.cpp) Config* Config::mainConfig = 0; Config::Config() { ... } Config* Config::getConfig() { if (mainConfig == 0) mainConfig = new Config(); return mainConfig; }
....
Dans le main.cpp : Config *superMainConfig = Config::getConfig();
int main () { if (superMainConfig->getConfigName() == "coucou") ... }
Est-ce que ça répond à la question ?
Bernard.
pasde.bcausse.spam
bernard tatin wrote:
Un singleton?
je ne vois pas le rapport, initialiseur statique et pattern singleton mais bon.
je debute en C++ et suis tres habitué (deformé) par Java :)
-- Bruno Causse http://perso.wanadoo.fr/othello
bernard tatin <bernard.tatin@nospam.tele2.fr.invalid> wrote:
Un singleton?
je ne vois pas le rapport, initialiseur statique et pattern singleton
mais bon.
je debute en C++ et suis tres habitué (deformé) par Java :)
je ne vois pas le rapport, initialiseur statique et pattern singleton mais bon.
je debute en C++ et suis tres habitué (deformé) par Java :)
Je suis allé un peu vite dans ma réponse.
Si tu veux passer de ce code Java :
// fichier Maclass.java class Maclass { public static int v = 15; }
à C++, c'est :
// fichier Maclass.h class Maclass { public: static int v; };
// fichier Maclass.cpp Maclass::v = 15;
Sinon, j'ai pas compris la question. Mais tout est possible en ce monde.
Bernard.
pasde.bcausse.spam
bernard tatin wrote:
Sinon, j'ai pas compris la question. Mais tout est possible en ce monde.
un initialiseur static java c'est du code :
Class maClass {
//initialiseur static static { //ici du code (comme une methode) .../... //ce code n'a pas besion d'etre appelé explicitement avant la 1er utilisation de la calsse }
.../... //suite de la classe }
voila -- Bruno Causse http://perso.wanadoo.fr/othello
bernard tatin <bernard.tatin@nospam.tele2.fr.invalid> wrote:
Sinon, j'ai pas compris la question. Mais tout est possible en ce monde.
un initialiseur static java c'est du code :
Class maClass {
//initialiseur static
static {
//ici du code (comme une methode)
.../...
//ce code n'a pas besion d'etre appelé explicitement
avant la 1er utilisation de la calsse
}
.../... //suite de la classe
}
voila
--
Bruno Causse
http://perso.wanadoo.fr/othello
Sinon, j'ai pas compris la question. Mais tout est possible en ce monde.
un initialiseur static java c'est du code :
Class maClass {
//initialiseur static static { //ici du code (comme une methode) .../... //ce code n'a pas besion d'etre appelé explicitement avant la 1er utilisation de la calsse }
.../... //suite de la classe }
voila -- Bruno Causse http://perso.wanadoo.fr/othello
Fabien LE LEZ
On Sat, 7 May 2005 10:32:27 +0200, (Bruno Causse):
un initialiseur static java c'est du code :
Class maClass { //initialiseur static static { //ici du code (comme une methode) .../... //ce code n'a pas besion d'etre appelé explicitement avant la 1er utilisation de la calsse }
En C++, ça n'existe pas tel quel. Le truc le plus approchant serait l'idiome du singleton.
Éventuellement, tu peux faire un truc comme ça :
class MaClasse; class Base_MaClasse { private: Base_MaClasse() { static bool est_premier_appel= true; if (est_premier_appel) { est_premier_appel= false; InitialisationStatique(); } }
static void InitialisationStatique(); friend class MaClasse; };
class MaClasse: Base_MaClasse { };
-- Le grand site de la philosophie animale : <http://perso.edulang.com/philo/>
On Sat, 7 May 2005 10:32:27 +0200, pasde.bcausse.spam@wanadoo.fr
(Bruno Causse):
un initialiseur static java c'est du code :
Class maClass {
//initialiseur static
static {
//ici du code (comme une methode)
.../...
//ce code n'a pas besion d'etre appelé explicitement
avant la 1er utilisation de la calsse
}
En C++, ça n'existe pas tel quel. Le truc le plus approchant serait
l'idiome du singleton.
Éventuellement, tu peux faire un truc comme ça :
class MaClasse;
class Base_MaClasse
{
private:
Base_MaClasse()
{
static bool est_premier_appel= true;
if (est_premier_appel)
{
est_premier_appel= false;
InitialisationStatique();
}
}
static void InitialisationStatique();
friend class MaClasse;
};
class MaClasse: Base_MaClasse
{
};
--
Le grand site de la philosophie animale : <http://perso.edulang.com/philo/>
On Sat, 7 May 2005 10:32:27 +0200, (Bruno Causse):
un initialiseur static java c'est du code :
Class maClass { //initialiseur static static { //ici du code (comme une methode) .../... //ce code n'a pas besion d'etre appelé explicitement avant la 1er utilisation de la calsse }
En C++, ça n'existe pas tel quel. Le truc le plus approchant serait l'idiome du singleton.
Éventuellement, tu peux faire un truc comme ça :
class MaClasse; class Base_MaClasse { private: Base_MaClasse() { static bool est_premier_appel= true; if (est_premier_appel) { est_premier_appel= false; InitialisationStatique(); } }
static void InitialisationStatique(); friend class MaClasse; };
class MaClasse: Base_MaClasse { };
-- Le grand site de la philosophie animale : <http://perso.edulang.com/philo/>
Matthieu Moy
(Bruno Causse) writes:
un initialiseur static java c'est du code :
Class maClass {
//initialiseur static static { //ici du code (comme une methode) .../... //ce code n'a pas besion d'etre appelé explicitement avant la 1er utilisation de la calsse }
.../... //suite de la classe }
Je connaissais pas ça en Java.
En C++, en général, les gens font quelque chose comme
class foo { static int forty_two; ... int init() { ... return 42; } }
int foo::forty_two = foo::init();
Je ne sais pas si il y a quelque chose de plus élégant.
//initialiseur static
static {
//ici du code (comme une methode)
.../...
//ce code n'a pas besion d'etre appelé explicitement
avant la 1er utilisation de la calsse
}
.../... //suite de la classe
}
Je connaissais pas ça en Java.
En C++, en général, les gens font quelque chose comme
class foo {
static int forty_two;
...
int init() {
...
return 42;
}
}
int foo::forty_two = foo::init();
Je ne sais pas si il y a quelque chose de plus élégant.
//initialiseur static static { //ici du code (comme une methode) .../... //ce code n'a pas besion d'etre appelé explicitement avant la 1er utilisation de la calsse }
.../... //suite de la classe }
Je connaissais pas ça en Java.
En C++, en général, les gens font quelque chose comme
class foo { static int forty_two; ... int init() { ... return 42; } }
int foo::forty_two = foo::init();
Je ne sais pas si il y a quelque chose de plus élégant.
-- Matthieu
Fabien LE LEZ
On Sat, 07 May 2005 11:00:19 +0200, Matthieu Moy :
int foo::forty_two = foo::init();
Attention, cette méthode ne permet pas de retarder l'appel à init() juste avant la construction du premier objet. Je ne sais pas bien si c'est ce qu'il faut, ne connaissant pas Java.
-- Le grand site de la philosophie animale : <http://perso.edulang.com/philo/>
On Sat, 07 May 2005 11:00:19 +0200, Matthieu Moy
<MatthieuNOSPAM.Moy@imag.fr.invalid>:
int foo::forty_two = foo::init();
Attention, cette méthode ne permet pas de retarder l'appel à init()
juste avant la construction du premier objet. Je ne sais pas bien si
c'est ce qu'il faut, ne connaissant pas Java.
--
Le grand site de la philosophie animale : <http://perso.edulang.com/philo/>
On Sat, 07 May 2005 11:00:19 +0200, Matthieu Moy :
int foo::forty_two = foo::init();
Attention, cette méthode ne permet pas de retarder l'appel à init() juste avant la construction du premier objet. Je ne sais pas bien si c'est ce qu'il faut, ne connaissant pas Java.
-- Le grand site de la philosophie animale : <http://perso.edulang.com/philo/>
Etienne Rousee
"Fabien LE LEZ" ...
Éventuellement, tu peux faire un truc comme ça :
class MaClasse; class Base_MaClasse { private: Base_MaClasse() { static bool est_premier_appel= true; if (est_premier_appel) { est_premier_appel= false; InitialisationStatique(); } }
static void InitialisationStatique(); friend class MaClasse; };
Si je crée deux instances BMC1 et BMC2 de Base_MaClasse, l'attribut statique est_premier_appel de chacun des constructeurs ne sera pas le même, donc ça ne marche pas. Il faudrait appeler le même constructeur, donc que le constructeur soit statique, ou appelle la même méthode statique. On en revient à quelque chose ressemblent au singleton, sauf que le constructeur est public. Je dis des bêtises ?
Etienne
"Fabien LE LEZ" <gramster@gramster.com> ...
Éventuellement, tu peux faire un truc comme ça :
class MaClasse;
class Base_MaClasse
{
private:
Base_MaClasse()
{
static bool est_premier_appel= true;
if (est_premier_appel)
{
est_premier_appel= false;
InitialisationStatique();
}
}
static void InitialisationStatique();
friend class MaClasse;
};
Si je crée deux instances BMC1 et BMC2
de Base_MaClasse, l'attribut statique
est_premier_appel de chacun des constructeurs
ne sera pas le même, donc ça ne marche pas.
Il faudrait appeler le même constructeur, donc
que le constructeur soit statique, ou appelle
la même méthode statique. On en revient à
quelque chose ressemblent au singleton, sauf que
le constructeur est public.
Je dis des bêtises ?
class MaClasse; class Base_MaClasse { private: Base_MaClasse() { static bool est_premier_appel= true; if (est_premier_appel) { est_premier_appel= false; InitialisationStatique(); } }
static void InitialisationStatique(); friend class MaClasse; };
Si je crée deux instances BMC1 et BMC2 de Base_MaClasse, l'attribut statique est_premier_appel de chacun des constructeurs ne sera pas le même, donc ça ne marche pas. Il faudrait appeler le même constructeur, donc que le constructeur soit statique, ou appelle la même méthode statique. On en revient à quelque chose ressemblent au singleton, sauf que le constructeur est public. Je dis des bêtises ?