OVH Cloud OVH Cloud

Objet membre statique

2 réponses
Avatar
Dee
Bonjour,

voici la rapide description de mon problème résumé avec des classes
simplifiées à l'extrème :
class T {
T() {}
~T() {}
};

class C {
static T t;
};

Dans mon code, je crée des instances de C de la manière suivante :
C *ptrc1 = new C;
C *ptrc2 = new C;
Question 1 : que se passe-t-il lors de l'appel de ces "new" ? Appelle-t-on
T() seulement lors de la première instance de C ?

Après traitement, je supprime les instances de C de la manière suivante :
delete ptrc1;
delete ptrc2;

Question 2 : que se passe-t-il lors de l'appel de ces delete ? Appelle-t-on
~T() lors de la dernière instance de C ?
Question 3 : si la réponse à Q2 est non, quel moyen ai-je pour faire passer
mon application dans ~T() ?

Question 4 : Le comportement est-il le même si T est une instantiation de
template ?

Merci à tout ceux qui sont très pointus dans ce domaine de me donner un
petit coup de pouce !
Pour les autres, le fait de lire 3 fois ce mail provoque le même effet qu'un
puissant somnifère ;-)

Yannick.

2 réponses

Avatar
Ivan Vecerina
"Dee" wrote in message
news:bp0hva$q4b$
| voici la rapide description de mon problème résumé avec des classes
| simplifiées à l'extrème :
| class T {
| T() {}
| ~T() {}
| };
|
| class C {
| static T t;
| };

Une variable de classe statique est comme une variable globale:
elle est construite avant l'execution de la fonction main(),
et detruite apres la sortie de celle-ci.

| Dans mon code, je crée des instances de C de la manière suivante :
| C *ptrc1 = new C;
| C *ptrc2 = new C;
| Question 1 : que se passe-t-il lors de l'appel de ces "new" ? Appelle-t-on
| T() seulement lors de la première instance de C ?
Non -- deja appele avant le debut de main.

| Après traitement, je supprime les instances de C de la manière suivante :
| delete ptrc1;
| delete ptrc2;
|
| Question 2 : que se passe-t-il lors de l'appel de ces delete ?
Appelle-t-on
| ~T() lors de la dernière instance de C ?
Non.

| Question 3 : si la réponse à Q2 est non, quel moyen ai-je pour faire
passer
| mon application dans ~T() ?
~T() sera appele automatiquement apres la fin du programme.
Pas possible de cette maniere. Mais C() et ~C() pourraient manuellement
compter les instances de C, et effectuer les operations necessaires
au moment voulu.

Eventuellement, t pourrait etre remplace par un singleton
(voir ce pattern pour des facons de controler la creation
et la destruction d'un objet).

| Question 4 : Le comportement est-il le même si T est une instantiation de
| template ?
Oui.

| Merci à tout ceux qui sont très pointus dans ce domaine de me donner un
| petit coup de pouce !
| Pour les autres, le fait de lire 3 fois ce mail provoque le même effet
qu'un
| puissant somnifère ;-)
Moi ca va ;)
Mais des details seraint utils pour une analyse plus poussee.

Amicalement,
Ivan
--
http://ivan.vecerina.com
Brainbench MVP for C++ <> http://www.brainbench.com
Avatar
Dee
"Ivan Vecerina" a écrit dans le
message de news: bp0its$hll$
"Dee" wrote in message
news:bp0hva$q4b$
| voici la rapide description de mon problème résumé avec des classes
| simplifiées à l'extrème :
| class T {
| T() {}
| ~T() {}
| };
|
| class C {
| static T t;
| };

Une variable de classe statique est comme une variable globale:
elle est construite avant l'execution de la fonction main(),
et detruite apres la sortie de celle-ci.

| Dans mon code, je crée des instances de C de la manière suivante :
| C *ptrc1 = new C;
| C *ptrc2 = new C;
| Question 1 : que se passe-t-il lors de l'appel de ces "new" ?
Appelle-t-on

| T() seulement lors de la première instance de C ?
Non -- deja appele avant le debut de main.


| Après traitement, je supprime les instances de C de la manière suivante
:

| delete ptrc1;
| delete ptrc2;
|
| Question 2 : que se passe-t-il lors de l'appel de ces delete ?
Appelle-t-on
| ~T() lors de la dernière instance de C ?
Non.

| Question 3 : si la réponse à Q2 est non, quel moyen ai-je pour faire
passer
| mon application dans ~T() ?
~T() sera appele automatiquement apres la fin du programme.
Pas possible de cette maniere. Mais C() et ~C() pourraient manuellement
compter les instances de C, et effectuer les operations necessaires
au moment voulu.

Eventuellement, t pourrait etre remplace par un singleton
(voir ce pattern pour des facons de controler la creation
et la destruction d'un objet).

| Question 4 : Le comportement est-il le même si T est une instantiation
de

| template ?
Oui.



OK pour tout ça ! Cela va m'être très utile.


| Merci à tout ceux qui sont très pointus dans ce domaine de me donner un
| petit coup de pouce !
| Pour les autres, le fait de lire 3 fois ce mail provoque le même effet
qu'un
| puissant somnifère ;-)
Moi ca va ;)



Il y a des gens comme ça ;-)

Mais des details seraint utils pour une analyse plus poussee.

Amicalement,
Ivan
--
http://ivan.vecerina.com
Brainbench MVP for C++ <> http://www.brainbench.com