Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

initialisation et double déclaration de données static d'un objet non instancié

119 réponses
Avatar
heinquoi
Bjr,
j'ai un pb de compréhension sur ce code:

class Main
{
public:
static HINSTANCE hInstance;
static HINSTANCE hPrevInstance;
static int nCmdShow;
static int MessageLoop( void );
};

HINSTANCE Main::hInstance = 0; // ici, je devrais avoir une
erreur
HINSTANCE Main::hPrevInstance = 0; // ici, aussi

il y a une double déclaration non ?
Si quelqu'un peut m'éclairer ? Et l'objet n'est meme pas initialisé.
Cordialement
Heinquoi

10 réponses

1 2 3 4 5
Avatar
Alain Naigeon
"James Kanze" a écrit dans le message news:

drkm writes:

|> writes:

|> > Au moins à une époque, il y a eu une résistance farouche
|> > contre l'introduction des nouveaux mots clés. Alors, Stroustrup
|> > à recycler static encore une fois, pour encore une autre
|> > signification (ou plutôt deux significations, puisque le
|> > concepte des fonctions membre static et des variables membre
|> > static ne sont que faiblement apparentés).

|> Tiens. J'ai toujours trouvé, de manière intuitive, que ces
|> deux concepts étaient fortement apparentés. En fait, je n'y ai
|> jamais vu qu'un unique concept : faire du membre déclaré un
|> membre de classe.



Il veut dire "membre de classe", par opposition à "membre d'instance",
c'est à dire qu'il y a un seul exemplaire pour tous les futurs objets de
cette classe.
Bon, tu le disais ensuite ! Mais je ne comprends pas ce que tu ne
comprends pas ici :-o C'est quand même très différent d'avoir
un membre par objet, ou un même membre pour tous les objets
de la classe.

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
drkm
James Kanze writes:

drkm writes:


[...]

|> Tiens. J'ai toujours trouvé, de manière intuitive, que ces
|> deux concepts étaient fortement apparentés. En fait, je n'y ai
|> jamais vu qu'un unique concept : faire du membre déclaré un
|> membre de classe.

Vue que tout ce qu'on déclare à l'intérieur d'une classe est
membre de la classe, je ne comprends pas la signification de ta phrase
par rapport à static.


J'employais « membre de classe » par opposition à « membre
d'instance ».

[...]

La « static » sur une variable membre joue sur la durée de vie
de l'objet ainsi défini, en précisant que la durée de vie de
cet objet est indépendant de toute instance. La « static » sur
une fonction membre influe comment on l'appelle (sans this), et permet
une syntaxe d'appel supplémentaire, sans objet.

Les deux définitions sont bien vaguement liées par l'idée que
ce qui est membre statique est indépendant des instances, mais la
façon que cette indépendence est spécifiée et est
considérée en C++ est assez différente dans les deux cas.


[...]

D'accord. Lorsque tu parlais de « concepts », je pensais que tu te
situais à un autre niveau qu'à celui de la formalisation dans la
norme, plutôt à un niveau interprétation, ou intention de la norme :
« ces membres, variables ou fonctions, sont indépendants d'une
instance, "appartiennent à la classe même" ».

--drkm

Avatar
drkm
"Alain Naigeon" writes:

Mais je ne comprends pas ce que tu ne
comprends pas ici :-o


Je pense qu'il a mal compris ma formulation, et l'a prise dans le
sens « fonction membre » ou « variable membre ».

--drkm

Avatar
drkm
James Kanze writes:

drkm writes:

|> "heinquoi" <nospam* writes:

|> > je vais m'en faire un copie et les conserver, si cela ne
|> > dérange pesonne.

|> Usenet est publique, libre à toi. Mais dans ce cas, je
|> préfère conserver un lien vers <URL:groups.google.com>, cela
|> permet de relire la discussion plus facilement, je trouve.

C'est lourd : le URL risque d'être fort long, et qu'est-ce qui se
passera dans le cas (bien peu probable, je l'avoue) que Google fait
faillite ?


Pas si peu probable que cela. Du moins, j'ai le souvenir que
deja.com me semblait tout autant indestructible.

Sinon, "http://groups.google.com/groups?selm=" + Message-ID. Ce qui
répond aux deux désavantages : longueur de l'URL, et pérennité (il est
facile de récupérer les Messages-ID et de s'en servir d'une autre
manière). Je trouve facile d'organiser mes bookmarks de manière
hiérarchique dans mon navigateur. Mais tout cela est bien sûr affaire
de goûts et de couleurs ...

--drkm

Avatar
drkm
James Kanze writes:

Quelque petits détails : d'abord, la tradition veut que le mot clé
const précède tout ce qui concerne le type.
^^^^^


Sans doute voulais-tu dire "static" ? Je vois mal sinon comment
respecter cette tradition.

--drkm

Avatar
James Kanze
drkm writes:

|> "Alain Naigeon" writes:

|> > Mais je ne comprends pas ce que tu ne
|> > comprends pas ici :-o

|> Je pense qu'il a mal compris ma formulation, et l'a prise dans le
|> sens « fonction membre » ou « variable membre ».

Tout à fait. Le concepte de membre de classe par rapport au membre
d'instance ne fait pas partie de C++. On ne parle que des « membres
de classes », y compris pour ce que dans d'autres langages, on
appelle « membres d'instance ». Et dans l'absence de l'expression
« membres d'instance », j'imaginais la signification C++, et non
la signification qu'il a voulu (qui est très courante dans d'autres
langages orientés objet).

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
drkm writes:

|> James Kanze writes:

|> > drkm writes:

|> [...]

|> > |> Tiens. J'ai toujours trouvé, de manière intuitive, que
|> > |> ces deux concepts étaient fortement apparentés. En fait,
|> > |> je n'y ai jamais vu qu'un unique concept : faire du membre
|> > |> déclaré un membre de classe.

|> > Vue que tout ce qu'on déclare à l'intérieur d'une classe
|> > est membre de la classe, je ne comprends pas la signification de
|> > ta phrase par rapport à static.

|> J'employais « membre de classe » par opposition à « membre
|> d'instance ».

Le problème, c'est que le C++ ne connaît pas le concepte « membre
d'instance ». En C++, un membre d'une classe peut être soit
statique, soit non-statique, c'est tout.

Je crois que ce point de vue est déterminé du fait que dans C++,
la classe, en tant que telle, n'est pas un objet.

|> [...]

|> > La « static » sur une variable membre joue sur la durée
|> > de vie de l'objet ainsi défini, en précisant que la durée
|> > de vie de cet objet est indépendant de toute instance. La «
|> > static » sur une fonction membre influe comment on l'appelle
|> > (sans this), et permet une syntaxe d'appel supplémentaire, sans
|> > objet.

|> > Les deux définitions sont bien vaguement liées par l'idée que
|> > ce qui est membre statique est indépendant des instances, mais la
|> > façon que cette indépendence est spécifiée et est
|> > considérée en C++ est assez différente dans les deux cas.

|> [...]

|> D'accord. Lorsque tu parlais de « concepts », je pensais que tu te
|> situais à un autre niveau qu'à celui de la formalisation dans la
|> norme, plutôt à un niveau interprétation, ou intention de la norme :
|> « ces membres, variables ou fonctions, sont indépendants d'une
|> instance, "appartiennent à la classe même" ».

Disons qu'indépendamment de la norme, la communauté C++ en
général ne parle pas des « variables instance » et « variables
classe ». Ce n'est pas que la norme ; c'est la façon que la
plupart des programmeurs C++ parlent (au moins dans les discussions dans
comp.lang.c++.moderated et ici).

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
drkm writes:

|> James Kanze writes:

|> > Quelque petits détails : d'abord, la tradition veut que le mot clé
|> > const précède tout ce qui concerne le type.
|> ^^^^^

|> Sans doute voulais-tu dire "static" ? Je vois mal sinon comment
|> respecter cette tradition.

Tout à fait.

J'ai hésité à parler de « storage class », parce que je
ne suis pas sur qu'un débuttant (qui se débat avec static) se
trouve à l'aise avec l'expression, mais la tradition veut que les
« storage class » (« static », « extern », « auto », « register »,
et en C, « typedef ») viennent en première position. On peut
écrire des choses comme :

int static const unsigned i ;
double typedef long ld ;

mais ce n'est pas considéré bon style. Nulle part, je crois (en
dehors de IOCCC).

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Alain Naigeon
"James Kanze" a écrit dans le message news:

drkm writes:

|> "Alain Naigeon" writes:

|> > Mais je ne comprends pas ce que tu ne
|> > comprends pas ici :-o

|> Je pense qu'il a mal compris ma formulation, et l'a prise dans le
|> sens « fonction membre » ou « variable membre ».

Tout à fait. Le concepte de membre de classe par rapport au membre
d'instance ne fait pas partie de C++. On ne parle que des « membres
de classes », y compris pour ce que dans d'autres langages, on
appelle « membres d'instance ». Et dans l'absence de l'expression
« membres d'instance », j'imaginais la signification C++, et non
la signification qu'il a voulu (qui est très courante dans d'autres
langages orientés objet).


Quand on parle *de* C++, on ne parle pas *en* C++ - comment
alors veux-tu conceptualiser la différence fondamentale entre les
deux cas ?

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France


--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93


Avatar
Alain Naigeon
"James Kanze" a écrit dans le message news:

drkm writes:

|> James Kanze writes:

|> > drkm writes:

|> [...]

|> > |> Tiens. J'ai toujours trouvé, de manière intuitive, que
|> > |> ces deux concepts étaient fortement apparentés. En fait,
|> > |> je n'y ai jamais vu qu'un unique concept : faire du membre
|> > |> déclaré un membre de classe.

|> > Vue que tout ce qu'on déclare à l'intérieur d'une classe
|> > est membre de la classe, je ne comprends pas la signification de
|> > ta phrase par rapport à static.

|> J'employais « membre de classe » par opposition à « membre
|> d'instance ».

Le problème, c'est que le C++ ne connaît pas le concepte « membre
d'instance ». En C++, un membre d'une classe peut être soit
statique, soit non-statique, c'est tout.


Le problème, c'est qu'en principe une explication ne doit pas être
circulaire ; or "statique" ne veut rien dire (immobile ??) d'autre que
le sens que lui donne... C++. Alors on est bien avancé ;-)
Dire que C++ ne connaît pas classe et instance, c'est peut-être vrai
au niveau du vocabulaire, mais enfin "new" fait bien quelque chose,
il me semble. Est-ce coupable de mettre un peu de concepts derrière
tout ça ? Et s'il faut les chercher ailleurs, est-ce vraiment un compliment
à l'égard de C++ ?

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

1 2 3 4 5