IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Declaration d'un pointeur global sur une classe dans un .h


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut Declaration d'un pointeur global sur une classe dans un .h
    Bonjour,

    J'ai besoin d'un pointeur global sur une instance de ma classe Échiquier ( j'ai besoin d'y accéder dans le main et dans le CALLBACK donc je n'ai pas d'autre choix ).
    Je l'ai donc tranquillement déclaré dans mon main.cpp

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Echiquier* lpEchiquier = NULL;
    Pas de problème jusque là, mais j'aimerai déménager cette déclaration dans mon ressource.h à côté de mes handles sur les objets D3D.
    Ma déclaration est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static Echiquier* lpEchiquier = NULL;
    Et là il me sort :
    error C2143: erreur de syntaxe*: absence de ';' avant '*'
    La ligne précédente étant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static IDirect3DVertexBuffer9* vertexBuffer;

    Je ne vois pas tellement comment me sortir de là ...
    Merci d'avance pour vos réponses

  2. #2
    Membre chevronné

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    426
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 426
    Par défaut
    Salut,

    Ben déjà si tu déclares ta variable static en dehors de tout espace, elle n'est plus globale, puisqu'elle devient indisponible en dehors du fichier fichier ou tu la déclares. ( Chapitre 3.6.3 du livre "Think in C++" )

    Et avec ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    static Echiquier::Echiquier* lpEchiquier = NULL;
    , ça donnes quoi?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut
    Étrange car j'ai déclaré mon LPDIRECT3DDEVICE9 en static dans mon ressource.h et l'initialise puis l'utilise dans mon main.cpp.
    Si je ne le déclare pas en static j'ai des problèmes de link.

    De toute façon, que je mette static, extern ou rien du tout il me sort toujours les mêmes erreurs

    Et avec ça :
    static Echiquier::Echiquier* lpEchiquier = NULL;
    Ça me dit que cette fontion surchargée n'es pas un type

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Ca n'a rien à voir avec le device D3D9. Le compilateur te dit juste qu'il ne sait pas ce qu’est un Echiquier à ce moment de la compilation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    // dans ressource.h
    #include "Echiquier.h"
     
    extern Echiquier* lpEchiquier;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // dans un fichier cpp quelconque, probablement le fichier qui 
    // contient le (win)main, ou dans le fichier cpp de la classe
    // Echiquier
     
    Echiquier* lpEchiquier = NULL;
    Surtout ne pas mettre la variable en static - ce n'est pas une static de classe dans ce cas. Du coup, si elle est déclarée en static, il va y avoir une instance de la variable par fichier cpp où est inclus le fichier ressource.h.

    Sur un autre sujet: il est inutile (et relativement malavisé) d'intégrer le type de la variable dans le nom de celle-ci (lp = long pointer ; déjà, la notion de long pointer n'existe plus depuis l'avènement de Win32 en... 95 (en sachant que Win32s existait sous Windows 3.1 et se passait déjà des long pointers). Ensuite, si demain tu décide que la variable est en fait une instance de Echiquier et non pas un pointeur vers une instance, tu va devoir modifier tout le code qui utilise la variable. Pas très fin )

    Sur (encore) un autre sujet : j'ai du mal à croire que la callback que tu appelles ne prends pas un LPVOID pParam en paramètre. Auquel cas, tu as la possibilité de te passer de cette variable globale, qui est un fort mauvais choix pour une globale (elle n'est pas stateless, elle ne correspond pas à une ressource système unique, etc).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    62
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 62
    Par défaut
    Ca n'a rien à voir avec le device D3D9.
    Bien sur

    Sur un autre sujet: il est inutile (et relativement malavisé) d'intégrer le type de la variable dans le nom de celle-ci (lp = long pointer ; déjà, la notion de long pointer n'existe plus depuis l'avènement de Win32 en... 95 (en sachant que Win32s existait sous Windows 3.1 et se passait déjà des long pointers). Ensuite, si demain tu décide que la variable est en fait une instance de Echiquier et non pas un pointeur vers une instance, tu va devoir modifier tout le code qui utilise la variable. Pas très fin )
    J'ai pris la ( mauvaise ? ) habitude de rajouter lp devant les pointeurs que je définit, ça me permet du premier coup d'œil de savoir à quoi j'ai affaire.
    Et sur ce coup là je suis sur que cette variable va rester un pointeur et rien d'autre : c'est dans le plan =3

    Sur (encore) un autre sujet : j'ai du mal à croire que la callback que tu appelles ne prends pas un LPVOID pParam en paramètre. Auquel cas, tu as la possibilité de te passer de cette variable globale, qui est un fort mauvais choix pour une globale (elle n'est pas stateless, elle ne correspond pas à une ressource système unique, etc).
    Ça a l'air bigrement intéressant cette histoire de LPVOID. Je creuserai cela

    J'avais déjà essayé de faire comme ça avec extern et sans static mais rien n'y fait. Il devrait le connaitre l’Echiquier pourtant car le header dans lequel il est déclaré est include juste avant -.-'

  6. #6
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par Kiwii Voir le message
    J'avais déjà essayé de faire comme ça avec extern et sans static mais rien n'y fait. Il devrait le connaitre l’Echiquier pourtant car le header dans lequel il est déclaré est include juste avant -.-'
    Il faudrait que tu postes les deux headers, parce qu'il y a quelque chose qui ne va pas. Le message que tu rencontres n'est pas très explicite, mais par expérience, je sais qu'on le voit arriver lorsqu'un type inconnu est considéré : le compilateur te dit qu'il ne comprends pas '*' dans ce contexte, et c'est parce qu'il ne comprends pas ce qu'il y a avant.

    Quoi qu'il en soit, c'est "extern", et surtout pas "static" dans ce cas particulier.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. récuperation variable globale d'une class dans un autre
    Par FATENMRABET dans le forum Débuter avec Java
    Réponses: 31
    Dernier message: 26/09/2013, 16h07
  2. Réponses: 4
    Dernier message: 25/06/2009, 11h40
  3. Réponses: 4
    Dernier message: 12/03/2008, 13h18
  4. Problème avec un pointeur global sur une variable manager
    Par sepullayer dans le forum C++/CLI
    Réponses: 12
    Dernier message: 26/03/2007, 13h00
  5. [MFC] Problème pointeur sur une classe
    Par mick74 dans le forum MFC
    Réponses: 7
    Dernier message: 14/04/2004, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo