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 :

Un objet/class accessible partout dans le code (pour acceder au options en fait)


Sujet :

C++

  1. #1
    Membre actif Avatar de Narann
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 211
    Points
    211
    Par défaut Un objet/class accessible partout dans le code (pour acceder au options en fait)
    Bonjours à tous!

    Je suis en train de coder un petit truc en OpenGL.

    J'ai une classe: ConfigGLExt qui vérifie, lors de sa création, que les extensions sont accessible et stock le résultat (bool).

    L'objectif étant de checker une seul fois l'existances des extensions et de d'y acceder via:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool ConfigGLExt::isSupport**monExtension**()
    {
    	return m_bSupport**monExtension**;
    }
    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool ConfigGLExt::isSupportTextureFilterAnisotropic()
    {
    	return m_bSupportTextureFilterAnisotropic;
    }
    Le problème est que j'aimerai que cet objet/class soit créé une seul fois (au début du programme) mais accessible partout dans le code.

    Auriez vous une idée de comment je pourrais m'y prendre? Il y a des instances, singletons toussa mais je me demandais si il n'y avais pas un moyen plus simple. Sachant qu'il ne servira qu'a faire des Get... Tout étant initialisé à la création de l'objet...

    Merci d'avance!

    Cordialement

    EDIT: Peut être avec une utilisation de friend? Je sais pas...
    EDIT2: Je vais quand même pas passer mon unique objet myConfigGLExt en argument de tout les autres objets si?

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Si tu n'as qu'une seule instance de ConfigGLExt le design pattern singleton pourrait faire l'affaire. Sinon tu peux aussi utiliser des variables statiques.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    69
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 69
    Points : 142
    Points
    142
    Par défaut
    Si tu n'as pas le choix, alors le singleton s'impose. Vérifie quand même si tous les accès à cet objet ne pourraient pas être rassemblés au même endroit, pour éviter de trimbaler un singleton...


    Ça n'est pas particulièrement compliqué, note bien, et c'est une solution plutôt élégante; la difficulté vient plutôt du fait que son utilisation n'est pas forcément justifiée, donc qu'il faut être vraiment sûr que ça vaille le coup.

  4. #4
    Membre actif Avatar de Narann
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 211
    Points
    211
    Par défaut
    Hello à tous et merci pour vos réponses!

    En effet, je suis en train de pencher sur le singleton.

    Vérifie quand même si tous les accès à cet objet ne pourraient pas être rassemblés au même endroit, pour éviter de trimbaler un singleton...
    ConfigGLExt (qui gère toute la partie "extension OpenGL" du code est appelé un peu partout. :/

    Sinon tu peux aussi utiliser des variables statiques.
    J'ai regardé aussi de ce coté là mais j'avoue ne pas comprendre... En effet, les variables statiques doivent être placé dans une classe que je suis supposé créer à chaque fois que j'en ai besoin. Ça ne me semble pas très élégant... Mais peut être que je me trompe...

    Un avis?

    Merci d'avance!

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par Narann Voir le message
    les variables statiques doivent être placé dans une classe que je suis supposé créer à chaque fois que j'en ai besoin. Ça ne me semble pas très élégant... Mais peut être que je me trompe...
    Les variable "classique" sont lier aux objets que tu vas instancier, tandis que les variable statiques vont être lier a ta classe et n'ont pas besoins qu'une instance soit créée.
    voir la FAQ

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    class Personne{
    public:
        static int nbPersonnes;//le nombre de personne créées, appartient a la classe
        int age;//l'age d'une personne, appartient a un objet
     
        Personne(int age){
            this->age = age;
            Personne::nbPersonnes++;//on a cree une personne
        }
    };
     
    int Personne::nbPersonnes = 0;//on initialise a 0
     
    int main(int argc, char** argv)
    {
        cout << "nombre de personne : " << Personne::nbPersonnes << endl;//affiche 0
     
        Personne* p1 = new Personne(3);
        Personne* p2 = new Personne(5);
     
        cout << "nombre de personne : " << Personne::nbPersonnes << endl;//affiche 2
        cout << "age de p1 : " << p1->age << endl;//affiche 3
        cout << "age de p2 : " << p2->age << endl;//affiche 5, les deux ages sont different
     
        delete p1;
        delete p2;
     
        cout << "age de p1 : " << p1->age << endl;//ERREUR age est dépendant de p1 que l'on vient de detruire
     
        Personne::nbPersonnes = 7;//mais rien n'empeche de modifier ou d'utiliser la variable statique
        cout << "nombre de personne : " << Personne::nbPersonnes << endl;//affiche 7
     
        return 0;
    }

  6. #6
    Membre actif Avatar de Narann
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 211
    Points
    211
    Par défaut
    Merci pour la réponse et l'exemple.

    Les variable "classique" sont lier aux objets que tu vas instancier, tandis que les variable statiques vont être lier a ta classe et n'ont pas besoins qu'une instance soit créée.
    J'ai bien compris. Mais si je souhaite accéder à ses variables (static) à l'autre bout de mon code, il faut bien que je créé une classe non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    /* Très loin dans le code */
    optionsDeConfiguration* myOptions = new optionsDeConfiguration(); //Je ne peut pas me passer de la création de la classe, via new, pour accéder aux options static non?
    Surface(myOptions->width, myOptions->height);
    Ce n'est pas un reproche, si il faut je ferais comme ça. C'est juste pour être sûr.

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par Narann Voir le message
    J'ai bien compris. Mais si je souhaite accéder à ses variables (static) à l'autre bout de mon code, il faut bien que je créé une classe non?
    Non justement. Tu confond classe et objet.
    Citation Envoyé par Narann Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    /* Très loin dans le code */
    optionsDeConfiguration* myOptions = new optionsDeConfiguration(); //Je ne peut pas me passer de la création de la classe, via new, pour accéder aux options static non?
    ici myOptions est un objet(ou une instance de classe si tu préfère) et optionsDeConfiguration est une classe.

    C'est un objet que tu crées et non une classe !
    de plus :
    Citation Envoyé par Narann Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Surface(myOptions->width, myOptions->height);
    "myOptions->width" et "myOptions->height" sont des variable "classique" et non statique si elles étaient statique voila comment tu aurais pu écrire ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Surface(optionsDeConfiguration::width, optionsDeConfiguration::height);
    et je n'ai en aucun cas besoin de "créer une classe" (ce que tu ne peut faire de toute façons).

  8. #8
    Membre actif Avatar de Narann
    Inscrit en
    Juin 2007
    Messages
    140
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 140
    Points : 211
    Points
    211
    Par défaut
    Mmmh ok!
    Je comprend mieux, merci pour ces précisions.

    Je pense quand même passer par un singleton car je ne fais pas "que" accéder au variables.

    Merci pour tout ça!

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

Discussions similaires

  1. utiliser un Objet défini en C dans mon code C++
    Par ikuzar dans le forum Débuter
    Réponses: 3
    Dernier message: 14/02/2011, 11h49
  2. Réponses: 10
    Dernier message: 20/10/2008, 17h25
  3. [Access] Problème dans le code d'enregistrement de saisies?
    Par zorba49 dans le forum Langage SQL
    Réponses: 6
    Dernier message: 21/06/2007, 12h18
  4. [Macro Access] pb dans mon code pour lancer une macro Access
    Par Commodore dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/06/2007, 10h51
  5. Accèder à un objet d'un FormX dans le code d'un unitY
    Par Akeon dans le forum C++Builder
    Réponses: 2
    Dernier message: 06/04/2007, 09h20

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