Bonjour,
j'aimerai savoir si j'ai bien compris le fonctionnement du mot clef
"extern" dans ce cas particulier.
extern CToto* pToto;
Class A
{
A();
~A();
void test()
{
ASSERT ( pToto != NULL );
}
};
est ce que Toto ets NULL ou non ??
Toto est il créé au chargement du programme ou pas ??
d'apres ce que j'ai compris, n'importe ou ou je declare cet "extern
CToto* pToto" , je peux acceder aux proprietes et methodes d'une
instance globale et unique de CToto ??
Qui se charge de la construction et de la destruction ??
Car je suis tombé sur des cas ou le developpeur fait un new CToto
dans sa classe malgre la declaration en extern, il se charge
egalement de sa destruction.
Je suis pas contre une complete reexplication claire et concise !! ;))
Car je crois que j'ai un beau fouillit dans le crane !!
Bonjour,
j'aimerai savoir si j'ai bien compris le fonctionnement du mot clef
"extern" dans ce cas particulier.
extern CToto* pToto;
Class A
{
A();
~A();
void test()
{
ASSERT ( pToto != NULL );
}
};
est ce que Toto ets NULL ou non ??
Toto est il créé au chargement du programme ou pas ??
d'apres ce que j'ai compris, n'importe ou ou je declare cet "extern
CToto* pToto" , je peux acceder aux proprietes et methodes d'une
instance globale et unique de CToto ??
Qui se charge de la construction et de la destruction ??
Car je suis tombé sur des cas ou le developpeur fait un new CToto
dans sa classe malgre la declaration en extern, il se charge
egalement de sa destruction.
Je suis pas contre une complete reexplication claire et concise !! ;))
Car je crois que j'ai un beau fouillit dans le crane !!
Bonjour,
j'aimerai savoir si j'ai bien compris le fonctionnement du mot clef
"extern" dans ce cas particulier.
extern CToto* pToto;
Class A
{
A();
~A();
void test()
{
ASSERT ( pToto != NULL );
}
};
est ce que Toto ets NULL ou non ??
Toto est il créé au chargement du programme ou pas ??
d'apres ce que j'ai compris, n'importe ou ou je declare cet "extern
CToto* pToto" , je peux acceder aux proprietes et methodes d'une
instance globale et unique de CToto ??
Qui se charge de la construction et de la destruction ??
Car je suis tombé sur des cas ou le developpeur fait un new CToto
dans sa classe malgre la declaration en extern, il se charge
egalement de sa destruction.
Je suis pas contre une complete reexplication claire et concise !! ;))
Car je crois que j'ai un beau fouillit dans le crane !!
Ahryman40k wrote:Bonjour,
j'aimerai savoir si j'ai bien compris le fonctionnement du mot clef
"extern" dans ce cas particulier.
extern CToto* pToto;
Extern déclare une variable globale, qu'il faut définir par ailleurs (sans
le extern) sans quoi tu as une erreur à l'édition de lien.
Par exemple dans toto.h :
extern CToto* pToto;
et dans toto.cpp :
CToto* pToto = NULL;Class A
{
A();
~A();
void test()
{
ASSERT ( pToto != NULL );
}
};
est ce que Toto ets NULL ou non ??
Toto est il créé au chargement du programme ou pas ??
Toto est créé automatiquement au chargement du programme avant la fonction
main(). Par contre, dans ton code, tu n'as pas la garantie que pToto soit
initialisé tant que tu n'es pas dans la fonction main(), ce qui est le cas
si tu crées d'autres objets globaux...d'apres ce que j'ai compris, n'importe ou ou je declare cet "extern
CToto* pToto" , je peux acceder aux proprietes et methodes d'une
instance globale et unique de CToto ??
Oui, mais elle doit être définie dans quelque part...Qui se charge de la construction et de la destruction ??
Dans le cas d'un objet global, c'est le compilateur qui s'en charge, comme
pour les objets auto, du reste, si ce n'est que leur durée de vie n'est
pas
locale à une fonction (construit avant main(), et détruit juste après).Car je suis tombé sur des cas ou le developpeur fait un new CToto
dans sa classe malgre la declaration en extern, il se charge
egalement de sa destruction.
C'est une autre question. Un pointeur CToto * ne créant pas d'objet CToto,
il faut bien faire un new si tu veux créer un objet et le faire pointer
dessus, et il faut le supprimer par ailleurs, avec delete...Je suis pas contre une complete reexplication claire et concise !! ;))
Car je crois que j'ai un beau fouillit dans le crane !!
Il y a confusion entre deux notions distinctes, à savoir les pointeurs,
qui
ne sont pas des objets, et les variables globales, qui peuvent être des
objets comme des pointeurs, qu'il conviendra alors de faire pointer sur un
objet valide, global ou pas...
Chris
Ahryman40k wrote:
Bonjour,
j'aimerai savoir si j'ai bien compris le fonctionnement du mot clef
"extern" dans ce cas particulier.
extern CToto* pToto;
Extern déclare une variable globale, qu'il faut définir par ailleurs (sans
le extern) sans quoi tu as une erreur à l'édition de lien.
Par exemple dans toto.h :
extern CToto* pToto;
et dans toto.cpp :
CToto* pToto = NULL;
Class A
{
A();
~A();
void test()
{
ASSERT ( pToto != NULL );
}
};
est ce que Toto ets NULL ou non ??
Toto est il créé au chargement du programme ou pas ??
Toto est créé automatiquement au chargement du programme avant la fonction
main(). Par contre, dans ton code, tu n'as pas la garantie que pToto soit
initialisé tant que tu n'es pas dans la fonction main(), ce qui est le cas
si tu crées d'autres objets globaux...
d'apres ce que j'ai compris, n'importe ou ou je declare cet "extern
CToto* pToto" , je peux acceder aux proprietes et methodes d'une
instance globale et unique de CToto ??
Oui, mais elle doit être définie dans quelque part...
Qui se charge de la construction et de la destruction ??
Dans le cas d'un objet global, c'est le compilateur qui s'en charge, comme
pour les objets auto, du reste, si ce n'est que leur durée de vie n'est
pas
locale à une fonction (construit avant main(), et détruit juste après).
Car je suis tombé sur des cas ou le developpeur fait un new CToto
dans sa classe malgre la declaration en extern, il se charge
egalement de sa destruction.
C'est une autre question. Un pointeur CToto * ne créant pas d'objet CToto,
il faut bien faire un new si tu veux créer un objet et le faire pointer
dessus, et il faut le supprimer par ailleurs, avec delete...
Je suis pas contre une complete reexplication claire et concise !! ;))
Car je crois que j'ai un beau fouillit dans le crane !!
Il y a confusion entre deux notions distinctes, à savoir les pointeurs,
qui
ne sont pas des objets, et les variables globales, qui peuvent être des
objets comme des pointeurs, qu'il conviendra alors de faire pointer sur un
objet valide, global ou pas...
Chris
Ahryman40k wrote:Bonjour,
j'aimerai savoir si j'ai bien compris le fonctionnement du mot clef
"extern" dans ce cas particulier.
extern CToto* pToto;
Extern déclare une variable globale, qu'il faut définir par ailleurs (sans
le extern) sans quoi tu as une erreur à l'édition de lien.
Par exemple dans toto.h :
extern CToto* pToto;
et dans toto.cpp :
CToto* pToto = NULL;Class A
{
A();
~A();
void test()
{
ASSERT ( pToto != NULL );
}
};
est ce que Toto ets NULL ou non ??
Toto est il créé au chargement du programme ou pas ??
Toto est créé automatiquement au chargement du programme avant la fonction
main(). Par contre, dans ton code, tu n'as pas la garantie que pToto soit
initialisé tant que tu n'es pas dans la fonction main(), ce qui est le cas
si tu crées d'autres objets globaux...d'apres ce que j'ai compris, n'importe ou ou je declare cet "extern
CToto* pToto" , je peux acceder aux proprietes et methodes d'une
instance globale et unique de CToto ??
Oui, mais elle doit être définie dans quelque part...Qui se charge de la construction et de la destruction ??
Dans le cas d'un objet global, c'est le compilateur qui s'en charge, comme
pour les objets auto, du reste, si ce n'est que leur durée de vie n'est
pas
locale à une fonction (construit avant main(), et détruit juste après).Car je suis tombé sur des cas ou le developpeur fait un new CToto
dans sa classe malgre la declaration en extern, il se charge
egalement de sa destruction.
C'est une autre question. Un pointeur CToto * ne créant pas d'objet CToto,
il faut bien faire un new si tu veux créer un objet et le faire pointer
dessus, et il faut le supprimer par ailleurs, avec delete...Je suis pas contre une complete reexplication claire et concise !! ;))
Car je crois que j'ai un beau fouillit dans le crane !!
Il y a confusion entre deux notions distinctes, à savoir les pointeurs,
qui
ne sont pas des objets, et les variables globales, qui peuvent être des
objets comme des pointeurs, qu'il conviendra alors de faire pointer sur un
objet valide, global ou pas...
Chris
Ahryman40k wrote:j'aimerai savoir si j'ai bien compris le fonctionnement du mot clef
"extern" dans ce cas particulier.
extern CToto* pToto;
Extern déclare une variable globale, qu'il faut définir par ailleurs
(sans le extern) sans quoi tu as une erreur à l'édition de lien.
Par exemple dans toto.h :
extern CToto* pToto;
et dans toto.cpp :
CToto* pToto = NULL;
Class A
{
A();
~A();
void test()
{
ASSERT ( pToto != NULL );
}
};
est ce que Toto ets NULL ou non ??
Toto est il créé au chargement du programme ou pas ??
Toto est créé automatiquement au chargement du programme avant la
fonction main(). Par contre, dans ton code, tu n'as pas la garantie
que pToto soit initialisé tant que tu n'es pas dans la fonction
main(), ce qui est le cas si tu crées d'autres objets globaux...
d'apres ce que j'ai compris, n'importe ou ou je declare cet "extern
CToto* pToto" , je peux acceder aux proprietes et methodes d'une
instance globale et unique de CToto ??
Oui, mais elle doit être définie dans quelque part...Qui se charge de la construction et de la destruction ??
Dans le cas d'un objet global, c'est le compilateur qui s'en charge,
comme pour les objets auto, du reste, si ce n'est que leur durée de
vie n'est pas locale à une fonction (construit avant main(), et
détruit juste après).Car je suis tombé sur des cas ou le developpeur fait un new CToto
dans sa classe malgre la declaration en extern, il se charge
egalement de sa destruction.
C'est une autre question. Un pointeur CToto * ne créant pas d'objet
CToto, il faut bien faire un new si tu veux créer un objet et le faire
pointer dessus, et il faut le supprimer par ailleurs, avec delete...
Je suis pas contre une complete reexplication claire et concise !!
;)) Car je crois que j'ai un beau fouillit dans le crane !!
Il y a confusion entre deux notions distinctes, à savoir les
pointeurs, qui ne sont pas des objets, et les variables globales, qui
peuvent être des objets comme des pointeurs, qu'il conviendra alors de
faire pointer sur un objet valide, global ou pas...
Ahryman40k wrote:
j'aimerai savoir si j'ai bien compris le fonctionnement du mot clef
"extern" dans ce cas particulier.
extern CToto* pToto;
Extern déclare une variable globale, qu'il faut définir par ailleurs
(sans le extern) sans quoi tu as une erreur à l'édition de lien.
Par exemple dans toto.h :
extern CToto* pToto;
et dans toto.cpp :
CToto* pToto = NULL;
Class A
{
A();
~A();
void test()
{
ASSERT ( pToto != NULL );
}
};
est ce que Toto ets NULL ou non ??
Toto est il créé au chargement du programme ou pas ??
Toto est créé automatiquement au chargement du programme avant la
fonction main(). Par contre, dans ton code, tu n'as pas la garantie
que pToto soit initialisé tant que tu n'es pas dans la fonction
main(), ce qui est le cas si tu crées d'autres objets globaux...
d'apres ce que j'ai compris, n'importe ou ou je declare cet "extern
CToto* pToto" , je peux acceder aux proprietes et methodes d'une
instance globale et unique de CToto ??
Oui, mais elle doit être définie dans quelque part...
Qui se charge de la construction et de la destruction ??
Dans le cas d'un objet global, c'est le compilateur qui s'en charge,
comme pour les objets auto, du reste, si ce n'est que leur durée de
vie n'est pas locale à une fonction (construit avant main(), et
détruit juste après).
Car je suis tombé sur des cas ou le developpeur fait un new CToto
dans sa classe malgre la declaration en extern, il se charge
egalement de sa destruction.
C'est une autre question. Un pointeur CToto * ne créant pas d'objet
CToto, il faut bien faire un new si tu veux créer un objet et le faire
pointer dessus, et il faut le supprimer par ailleurs, avec delete...
Je suis pas contre une complete reexplication claire et concise !!
;)) Car je crois que j'ai un beau fouillit dans le crane !!
Il y a confusion entre deux notions distinctes, à savoir les
pointeurs, qui ne sont pas des objets, et les variables globales, qui
peuvent être des objets comme des pointeurs, qu'il conviendra alors de
faire pointer sur un objet valide, global ou pas...
Ahryman40k wrote:j'aimerai savoir si j'ai bien compris le fonctionnement du mot clef
"extern" dans ce cas particulier.
extern CToto* pToto;
Extern déclare une variable globale, qu'il faut définir par ailleurs
(sans le extern) sans quoi tu as une erreur à l'édition de lien.
Par exemple dans toto.h :
extern CToto* pToto;
et dans toto.cpp :
CToto* pToto = NULL;
Class A
{
A();
~A();
void test()
{
ASSERT ( pToto != NULL );
}
};
est ce que Toto ets NULL ou non ??
Toto est il créé au chargement du programme ou pas ??
Toto est créé automatiquement au chargement du programme avant la
fonction main(). Par contre, dans ton code, tu n'as pas la garantie
que pToto soit initialisé tant que tu n'es pas dans la fonction
main(), ce qui est le cas si tu crées d'autres objets globaux...
d'apres ce que j'ai compris, n'importe ou ou je declare cet "extern
CToto* pToto" , je peux acceder aux proprietes et methodes d'une
instance globale et unique de CToto ??
Oui, mais elle doit être définie dans quelque part...Qui se charge de la construction et de la destruction ??
Dans le cas d'un objet global, c'est le compilateur qui s'en charge,
comme pour les objets auto, du reste, si ce n'est que leur durée de
vie n'est pas locale à une fonction (construit avant main(), et
détruit juste après).Car je suis tombé sur des cas ou le developpeur fait un new CToto
dans sa classe malgre la declaration en extern, il se charge
egalement de sa destruction.
C'est une autre question. Un pointeur CToto * ne créant pas d'objet
CToto, il faut bien faire un new si tu veux créer un objet et le faire
pointer dessus, et il faut le supprimer par ailleurs, avec delete...
Je suis pas contre une complete reexplication claire et concise !!
;)) Car je crois que j'ai un beau fouillit dans le crane !!
Il y a confusion entre deux notions distinctes, à savoir les
pointeurs, qui ne sont pas des objets, et les variables globales, qui
peuvent être des objets comme des pointeurs, qu'il conviendra alors de
faire pointer sur un objet valide, global ou pas...
Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation dynamique,
dont l'ordre n'est plus garantie : dans d'autres initialisations
dynamiques, on peut voir pToto initialisé avec le new, mais on peut
aussi le voir initialisé à zéro, c-à-d NULL.
Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation dynamique,
dont l'ordre n'est plus garantie : dans d'autres initialisations
dynamiques, on peut voir pToto initialisé avec le new, mais on peut
aussi le voir initialisé à zéro, c-à-d NULL.
Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation dynamique,
dont l'ordre n'est plus garantie : dans d'autres initialisations
dynamiques, on peut voir pToto initialisé avec le new, mais on peut
aussi le voir initialisé à zéro, c-à-d NULL.
Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation dynamique,
dont l'ordre n'est plus garantie : dans d'autres initialisations
dynamiques, on peut voir pToto initialisé avec le new, mais on peut
aussi le voir initialisé à zéro, c-à-d NULL.
Je ne suis pas sur de comprendre, et je voudrais etre sur, là.
Tu veux dire que si on fait ca :
// dans toto.h
class CToto {..};
extern CToto *pToto;
// dans toto.cpp
CToto* pToto = new CToto;
// dans main.cpp
#include "toto.h"
int main()
{
asssert(pToto!=NULL); // !!!
}
Tu veux dire que selon plateforme/compilo/direction du vent, l'assert
peut se déclencher ????
Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation dynamique,
dont l'ordre n'est plus garantie : dans d'autres initialisations
dynamiques, on peut voir pToto initialisé avec le new, mais on peut
aussi le voir initialisé à zéro, c-à-d NULL.
Je ne suis pas sur de comprendre, et je voudrais etre sur, là.
Tu veux dire que si on fait ca :
// dans toto.h
class CToto {..};
extern CToto *pToto;
// dans toto.cpp
CToto* pToto = new CToto;
// dans main.cpp
#include "toto.h"
int main()
{
asssert(pToto!=NULL); // !!!
}
Tu veux dire que selon plateforme/compilo/direction du vent, l'assert
peut se déclencher ????
Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation dynamique,
dont l'ordre n'est plus garantie : dans d'autres initialisations
dynamiques, on peut voir pToto initialisé avec le new, mais on peut
aussi le voir initialisé à zéro, c-à-d NULL.
Je ne suis pas sur de comprendre, et je voudrais etre sur, là.
Tu veux dire que si on fait ca :
// dans toto.h
class CToto {..};
extern CToto *pToto;
// dans toto.cpp
CToto* pToto = new CToto;
// dans main.cpp
#include "toto.h"
int main()
{
asssert(pToto!=NULL); // !!!
}
Tu veux dire que selon plateforme/compilo/direction du vent, l'assert
peut se déclencher ????
Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation dynamique,
dont l'ordre n'est plus garantie : dans d'autres initialisations
dynamiques, on peut voir pToto initialisé avec le new, mais on peut
aussi le voir initialisé à zéro, c-à-d NULL.
Je ne suis pas sur de comprendre, et je voudrais etre sur, là. Tu
veux dire que si on fait ca :
// dans toto.h
class CToto {..};
extern CToto *pToto;
// dans toto.cpp
CToto* pToto = new CToto;
// dans main.cpp
#include "toto.h"
int main()
{
asssert(pToto!=NULL); // !!!
}
Tu veux dire que selon plateforme/compilo/direction du vent, l'assert
peut se déclencher ????
Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation dynamique,
dont l'ordre n'est plus garantie : dans d'autres initialisations
dynamiques, on peut voir pToto initialisé avec le new, mais on peut
aussi le voir initialisé à zéro, c-à-d NULL.
Je ne suis pas sur de comprendre, et je voudrais etre sur, là. Tu
veux dire que si on fait ca :
// dans toto.h
class CToto {..};
extern CToto *pToto;
// dans toto.cpp
CToto* pToto = new CToto;
// dans main.cpp
#include "toto.h"
int main()
{
asssert(pToto!=NULL); // !!!
}
Tu veux dire que selon plateforme/compilo/direction du vent, l'assert
peut se déclencher ????
Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation dynamique,
dont l'ordre n'est plus garantie : dans d'autres initialisations
dynamiques, on peut voir pToto initialisé avec le new, mais on peut
aussi le voir initialisé à zéro, c-à-d NULL.
Je ne suis pas sur de comprendre, et je voudrais etre sur, là. Tu
veux dire que si on fait ca :
// dans toto.h
class CToto {..};
extern CToto *pToto;
// dans toto.cpp
CToto* pToto = new CToto;
// dans main.cpp
#include "toto.h"
int main()
{
asssert(pToto!=NULL); // !!!
}
Tu veux dire que selon plateforme/compilo/direction du vent, l'assert
peut se déclencher ????
amerio wrote:Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation
dynamique, dont l'ordre n'est plus garantie : dans d'autres
initialisations dynamiques, on peut voir pToto initialisé avec le
new, mais on peut aussi le voir initialisé à zéro, c-à-d NULL.
Je ne suis pas sur de comprendre, et je voudrais etre sur, là. Tu
veux dire que si on fait ca :
// dans toto.h
class CToto {..};
extern CToto *pToto;
// dans toto.cpp
CToto* pToto = new CToto;
// dans main.cpp
#include "toto.h"
int main()
{
asssert(pToto!=NULL); // !!!
}
Tu veux dire que selon plateforme/compilo/direction du vent,
l'assert peut se déclencher ????
Le problème ne se pose pas dès lors que tu es dans main. Si j'ai bien
compris les propos de James :
struct CTotoUser
{
CTotoUser( CToto * pToto ) {
assert( pToto!=NULL); }
};
CToto * pToto = new CToto;
CTotoUser TotoUser( pToto );
Bien que pToto soit avant TotoUser, il ne sera initialisé qu'après,
car is s'agit d'une initialisation dynamique pour le premier, et
statique pour le second...
amerio wrote:
Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation
dynamique, dont l'ordre n'est plus garantie : dans d'autres
initialisations dynamiques, on peut voir pToto initialisé avec le
new, mais on peut aussi le voir initialisé à zéro, c-à-d NULL.
Je ne suis pas sur de comprendre, et je voudrais etre sur, là. Tu
veux dire que si on fait ca :
// dans toto.h
class CToto {..};
extern CToto *pToto;
// dans toto.cpp
CToto* pToto = new CToto;
// dans main.cpp
#include "toto.h"
int main()
{
asssert(pToto!=NULL); // !!!
}
Tu veux dire que selon plateforme/compilo/direction du vent,
l'assert peut se déclencher ????
Le problème ne se pose pas dès lors que tu es dans main. Si j'ai bien
compris les propos de James :
struct CTotoUser
{
CTotoUser( CToto * pToto ) {
assert( pToto!=NULL); }
};
CToto * pToto = new CToto;
CTotoUser TotoUser( pToto );
Bien que pToto soit avant TotoUser, il ne sera initialisé qu'après,
car is s'agit d'une initialisation dynamique pour le premier, et
statique pour le second...
amerio wrote:Rien n'empêche d'écrire quelque chose du genre :
CToto* pToto = new CToto ;
Mais attention : dans ce cas-là, c'est une initialisation
dynamique, dont l'ordre n'est plus garantie : dans d'autres
initialisations dynamiques, on peut voir pToto initialisé avec le
new, mais on peut aussi le voir initialisé à zéro, c-à-d NULL.
Je ne suis pas sur de comprendre, et je voudrais etre sur, là. Tu
veux dire que si on fait ca :
// dans toto.h
class CToto {..};
extern CToto *pToto;
// dans toto.cpp
CToto* pToto = new CToto;
// dans main.cpp
#include "toto.h"
int main()
{
asssert(pToto!=NULL); // !!!
}
Tu veux dire que selon plateforme/compilo/direction du vent,
l'assert peut se déclencher ????
Le problème ne se pose pas dès lors que tu es dans main. Si j'ai bien
compris les propos de James :
struct CTotoUser
{
CTotoUser( CToto * pToto ) {
assert( pToto!=NULL); }
};
CToto * pToto = new CToto;
CTotoUser TotoUser( pToto );
Bien que pToto soit avant TotoUser, il ne sera initialisé qu'après,
car is s'agit d'une initialisation dynamique pour le premier, et
statique pour le second...