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
Gabriel Dos Reis
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.

La personne ci-nommée m'a confié il y a quelques mois que pour lui,
"static" a toujours voulu dire la même chose pour donnée membre
statique et variable locale statique : il y a exactement une instance
dans le programme.
(Il est peut-être utile de rappeler que la notion de "classe" est
empruntée à Simula, et aller voir ce que Simula entendait par
"classe"...)

-- Gaby
Avatar
drkm
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.

Je n'arrive pas à comprendre cette différence que tu fais, et n'ai
pas la norme sous la main pour les définitions de static dans ces
contextes.

Peux-tu m'éclairer ?

--drkm

Avatar
Michel Michaud
Dans news:409b655b$0$27682$,
N'ayant trouvé aucune doc aussi clair que vos poste (meme ds
"Le langage c++" de Bjarne Stroustrup)


Tu parles de la version française ? Quelle édition ? (2003
ou plus, c'est celle que j'ai révisée...) Veux-tu dire que
tu n'y trouves pas l'information ou qu'elle n'est pas assez
claire ?

Je serais surpris que tu ne trouves pas l'information sur
static dans ce livre, mais évidemment, si tu veux retrouver
toutes les explications sur tous les sens de static dans la
même section, je ne crois pas que c'est le cas... Par
ailleurs, même si j'ai fait la révision technique, je n'ai
pas pu retoucher les passages techniquement corrects même
lorsque je trouvais les explications moins limpides qu'elles
auraient pu être... Alors il est possible que ce ne soit pas
« assez » clair, mais je t'assure que les informations sont
correctes, sauf erreur de ma part !

Si tu as une édition française avant 2003, alors il est bien
possible que les explications ne soient pas claires... ni
même correctes :-(

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/

Avatar
drkm
Fabien LE LEZ writes:

Exemple :

// .h

class Main
{
static size_t const TAILLE_TABLEAU= 12;
unsigned tableau [TAILLE_TABLEAU];
};

// .cpp

size_t const Main::TAILLE_TABLEAU;


Est-on obligé dans ce cas, celui d'une constante entière initia lisée
dans un en-tête, de la définire par ailleurs ?

--drkm

Avatar
drkm
"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.

--drkm

Avatar
heinquoi
"Michel Michaud" a écrit dans le message de
news:NA3nc.100364$
Dans news:409b655b$0$27682$,
N'ayant trouvé aucune doc aussi clair que vos poste (meme ds
"Le langage c++" de Bjarne Stroustrup)


Tu parles de la version française ? Quelle édition ? (2003
ou plus, c'est celle que j'ai révisée...)


Edition 2002: tres complet 1100 pages. Mais pas toujours tres clair. Et
consernant static, les explication y sont en plusieurs endroits.

Veux-tu dire que
tu n'y trouves pas l'information ou qu'elle n'est pas assez
claire ?


Pas tres clair.

Je serais surpris que tu ne trouves pas l'information sur
static dans ce livre, mais évidemment, si tu veux retrouver
toutes les explications sur tous les sens de static dans la
même section, je ne crois pas que c'est le cas...


effectivement

Par
ailleurs, même si j'ai fait la révision technique, je n'ai
pas pu retoucher les passages techniquement corrects même
lorsque je trouvais les explications moins limpides qu'elles
auraient pu être...


Tu as fait la traduction? Bravo, trvail fabuleux et ... long. 1100 pages
tres techniques.

Alors il est possible que ce ne soit pas
« assez » clair, mais je t'assure que les informations sont
correctes, sauf erreur de ma part !


Tout ce que j'y ai vu etait correcte et détaillé.

Si tu as une édition française avant 2003, alors il est bien
possible que les explications ne soient pas claires... ni
même correctes :-(


tres correcte et detaillé mais pas tjrs clair

Et je me demande si je peux mettre un donnée en static et const tel que:

const static HINSTANCE hInstance;


cordialement
HEINQUOI


Avatar
Michel Michaud
Dans news:409d0137$0$27684$,
"Michel Michaud" a écrit dans le message de
news:NA3nc.100364$
Dans news:409b655b$0$27682$,
N'ayant trouvé aucune doc aussi clair que vos poste (meme ds
"Le langage c++" de Bjarne Stroustrup)


Tu parles de la version française ? Quelle édition ? (2003
ou plus, c'est celle que j'ai révisée...)


Edition 2002: tres complet 1100 pages. Mais pas toujours tres
clair. Et consernant static, les explication y sont en
plusieurs endroits.


Et j'ai fait plus de 1000 corrections à cette version, qui
contient beaucoup d'erreurs, des choses farfelues, du
vocabulaire incorrect, des bouts incompréhensibles, etc.

Vraiment tu ne peux pas t'y fier. C'est dommage... Si tu l'as
acheté récemment, fais-toi rembourser et achète la plus
récente version...

[...]
Par
ailleurs, même si j'ai fait la révision technique, je n'ai
pas pu retoucher les passages techniquement corrects même
lorsque je trouvais les explications moins limpides qu'elles
auraient pu être...


Tu as fait la traduction? Bravo, trvail fabuleux et ... long.
1100 pages tres techniques.


Non, j'ai fait faire des corrections et des ajouts... Ce n'était
peut-être pas aussi long mais ce fut quand même long (tout relire
et tout vérifier ce qui me paraissait moindrement douteux par
rapport à la version anglaise). Mais bon, au moins je n'ai pas
fait ça tout à fait bénévolement et ça m'a permis de trouver
une trentaine d'erreurs dans la version anglaise...

Alors il est possible que ce ne soit pas
« assez » clair, mais je t'assure que les informations sont
correctes, sauf erreur de ma part !


Tout ce que j'y ai vu etait correcte et détaillé.


Tant mieux, je n'ai pas vérifié ce que j'avais fait faire
sur les static. Ceci dit, il y a réellement beaucoup d'erreurs,
tu peux voir notre discussion ici à ce sujet (et ce n'était
que la pointe de l'iceberg)... À titre d'exemple, le livre
utilisait systématiquement « opérateurs d'itération » au lieu
du simple « itérateur »...

Si tu as une édition française avant 2003, alors il est bien
possible que les explications ne soient pas claires... ni
même correctes :-(


tres correcte et detaillé mais pas tjrs clair


Le problème, c'est que si tu ne sais pas d'avance ce qui doit
être dit, ce sera difficile de savoir que ce n'est pas correct !

Et je me demande si je peux mettre un donnée en static et const
tel que:

const static HINSTANCE hInstance;


Oui et dans ce cas, tu peux l'initialiser à la déclaration
dans la classe...

--
Michel Michaud
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/



Avatar
James Kanze
"heinquoi" <nospam* writes:

|> Et je me demande si je peux mettre un donnée en static et const
|> tel que:

|> const static HINSTANCE hInstance;

Tout à fait. Aussi bien à la portée de namespace qu'à la
portée de classe ou à la portée locale (avec chaque fois une
signification différente de static:-)).

Quelque petits détails : d'abord, la tradition veut que le mot clé
const précède tout ce qui concerne le type. On écrira de
préférence donc :
static const HINSTANCE hInstance ;
voire même :
static HINSTANCE const hInstance ;
Entre ces deux derniers, personnellement, je préfère le
séconde, mais il y en a d'autres (dont Bjarne Stroustrup) qui
préfère le premier. (Je pourrais te présenter les arguments des
deux côtés, mais ça risque d'être un peu ennuyeux.) C'est
donc une question de style. En revanche, le comité C a, je crois, dit
que le droit de mettre le static autre part qu'au début est
« deprecated » ; c'est donc que c'est officiellement
considéré mauvais style.

Enfin, en C++, une variable déclarée const à la portée de
namespace est static par défaut. Personnellement, je préfère
le dire quand même, mais c'est une question de style -- au moins que
tu écris des en-têtes qui doivent être compatible C et C++.
Aussi, c'est « deprecated », ou au moins mal vu des experts --
cette utilisation de static (la plus ancienne ?) a été remplacé
par des namespace anonyme.

--
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:

|> "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 ?

Il ne serait pas le premier à faire une petite collection des
postings avec des tips qu'il a trouvés intéressants. Les news sont
là pour ça aussi.

En revanche, si tu rends ta collection publique, il serait bon ton de
garder les attributions.

--
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:

|> 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.

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.

Il y a une faible appartenance entre le static des fonctions membres et
le static des variables membres -- les deux correspondent à membres
du métaclasse dans les langages qui ont des métaclasses. Mais le
C++ n'est pas un tel langage, et n'a pas de concepte du métaclasse.

Est-ce que c'est ça que tu veux dire : qu'elles appariennent à la
classe, et non pas à une instance de la classe ? Si oui, je comprends
ce que tu veux dire, mais c'est un point de vue assez éloigné de
la façon habituelle de considérer le C++ ; ce n'est pas la
façon que la norme explique la différence, par exemple.

|> Je n'arrive pas à comprendre cette différence que tu fais,
|> et n'ai pas la norme sous la main pour les définitions de static
|> dans ces contextes.

|> Peux-tu m'éclairer ?

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.

Dans d'autres langages, je crois que la différence est moindre, et
qu'on parle bien des variables et des méthodes d'instance ou de
classe. Je crois que dans la plupart des tels langages, en revanche, il
y a bien le concepte d'une méta-classe -- souvent, la fonction de la
méta-classe serait appelée avec un this (ou self) qui
référence à une instance de la méta-classe, par exemple, et
les variables membre statiques résidéraient dans cette instance.

--
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
1 2 3 4 5