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 :

[POO]Comment initialiser un objet membre static ?


Sujet :

C++

  1. #1
    Invité
    Invité(e)
    Par défaut [POO]Comment initialiser un objet membre static ?
    Salut allons droit au but !

    Comme le dit l'intitulé du sujet :

    "Comment initialiser un objet membre static ?"

    Explication:

    J'ai une classe Mere(classe de base) : "Frame" qui possède un attribut static que voici :
    Note : J'utilise la librairie SFML.

    Cette classe a plusieurs classes filles dont : "Map", "Game", "Character" etc...
    Toutes ces classes filles pour "se Bliter" utilisent l'objet membre sf::RenderWindow App :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    App.Draw(MyMap);
    App.Draw(MyCharacter);
    //etc....

    Un type primitif c'est facile il suffit d'écrire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int MaClasse::membreStatic = 0; // par exemple
    Mais puisque "App" est un objet membre static comment faut-il l'initialiser ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sf::RenderWindow Frame::App = 0; // ? <-- ça reste à voir !

    Je sais qu'on peut créer un pointeur sur un objet et l'initialiser ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sf::RenderWindow * Frame::App = NULL;
    Mais y'a t-il une autre solution que les pointeurs ?
    J'accepte toutes les réponses à condition que ce soit de la P.O.O. !


    Note : y'a-t-il un rapport avec le fiasco des variables static que l'on trouve dans la F.AQ. C++ ?

    Cordialement

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    A question simple, réponse simple, dans le .hpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    class Machin {
    static ZolieClasse bidule;
    }
    Dans le cpp:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ZolieClasse Machin::bidule(les arguments que tu veux passer au constructeur);
    PS: ça n'a rien à voir avec de la POO, et utiliser des pointeurs en static est une idée fichtrement mauvaise, ils ne seront jamais libérés.

  3. #3
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,
    Citation Envoyé par zais_ethael Voir le message
    <snip>t utiliser des pointeurs en static est une idée fichtrement mauvaise, ils ne seront jamais libérés.
    Pas forcément... Qu'il te suffise de regarder le pattern singleton pour te convaincre qu'un pointeur static peut très bien être utilisé et libéré de manière sécurisante

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    1 064
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 064
    Points : 1 053
    Points
    1 053
    Par défaut
    Moui, il y a une fameuse différence entre un pattern, notion purement théorique, et les difficultés techniques liées à la syntaxe du C++.
    La seule méthode qui me vienne à l'esprit pour gérer un pointeur static est de déclarer une classe bidon dans un cpp avec une instance globale et un destructeur pour le delete. On peut aussi faire simple en déclarant par valeur ou en utilisant un auto_ptr...

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci zais et koala01.
    C'est vrai qu'a question simple, réponse simple.
    Mais à question autre, y'a t-il réponse autre ?

    J'ai une classe du nom de Enemy qui a un membre sf::Image img_Enemy image en static car tous les ennemies utilisent la même image.
    Elle est donc unique pour toute la classe


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    sf::Image Enemy::img_Enemy;
    if(!Enemy::img_Enemy.LoadFromFile("./photos/Enemy.bmp"))
       exit(4);
    Enemy::img_Enemy.SetSmooth(false);

    Mais le code du dessus me génère comme erreur:


    expected unqualified-id before "if"
    expected `,' or `;' before "if"
    expected constructor, destructor, or type conversion before '.' token
    expected `,' or `;' before '.' token


    Si j'enlève les 3 dernières ligne de codes il me génère plus d'erreurs mais l'image ne s'affiche pas à l'écran.

    Comment y remédier ?
    Donc y'a t-il réponse autre ? (Je sais ça fait 1 questions de plus )

    Cordialement

  6. #6
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Hé bien, il pourrait peut être s'avérer utile, justement, de revoir ta conception pour envisager, par exemple, la mise au point d'un "gestionnaire de ressources" qui pourrait maintenir, entre autres et par exemple, l'ensemble des images qui sont utilisées...

    Ce gestionnaire - qui serait éventuellement une adaptation du pattern singleton - serait initialisé en chargeant systématiquement toutes les images nécessaires, et toutes les classes qui ont besoin d'images se contenteraient d'un pointeur vers l'image dont elles ont besoin...

    [EDIT]Maintenant, je reconnais aussi qu'il ne faut pas d'office verser dans la "singletonite aigue", mais, l'idée reste d'avoir une seule instance de chaque image chargée quelque part (en dehors des classes qui ont besoin de ces images, et dans une classe dont la responsabilité sera d'en gérer le chargement et le déchargement), et d'avoir, tout simplement, un pointeur vers ces images dans les classes qui les utilisent

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/01/2007, 13h42
  2. Réponses: 3
    Dernier message: 06/01/2007, 14h46
  3. Réponses: 6
    Dernier message: 22/09/2006, 13h31
  4. Réponses: 7
    Dernier message: 29/03/2006, 21h41
  5. Réponses: 1
    Dernier message: 11/02/2006, 12h50

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