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 :

mot-clef static


Sujet :

C++

  1. #1
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut mot-clef static
    bonjour, je voudrais avoir des informations sur le mot clef 'static' en c++
    j'ai une classe qui comporte une methode static (je peux pas faire autrement)
    et dans cette classe, j'ai egalement un attribut:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class Control
    {
    protected:
        int arrowUpPressed;
     
    protected:
        static int keyboardFilter(SDL_Event*);
     
    public:
        Control();
        bool isArrowUpPressed();
    };
    dans mon constructeur, j'ai une fonction qui etablit keyboardFilter en tant que fonction reflexe (=callback).
    Le probleme est que cette fonction reflexe ne veux pas acceder à arrowUpPressed parce qu'elle n'est pas 'static', et si je lui rajoute ce mot clef, c'est isArrowUpPressed() qui ne veux plus fonctionner.

    une idée pour m'éclairer?

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Tu es sûr que tu ne peux pas passer de paramètre supplémentaire à ta fonction reflexe ?

    Si tu ne peux, ben...
    • Soit, tu déclares int arrowUpPressed en static, tu l'instancies, dans le fichier source de ta classe, et il sera partagé entre toutes les instances de la classe
    • Soit tu déclares en membre static un pointeur vers une instance particulière de ta classe, dont le int arrowUpPressed sera utilisé.

  3. #3
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    "Soit tu déclares en membre static un pointeur vers une instance particulière de ta classe, dont le int arrowUpPressed sera utilisé."

    je pense que je ferais ça! je test ce soir et validerait ton resultat

  4. #4
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Le mot clé 'static' sur une méthode d'une classe permet de définir cette méthode comme étant une méthode de classe et non plus comme une méthode d'une instance de classe.

    C'est deux choses différentes.

    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
     
    class Test {
    public: 
        int max (int a, int b);
    };
     
    class Test2 {
    public:
        static int max (int a, int b);
    };
     
    Test test1;
    std::cout << "max : " << test1.max (10, 20) << std::endl;
     
     
    std::cout << "max : " << Test2::max (20, 10) << std::endl;
    Sans le mot static j'ai dû passer par une instance de la classe Test afin de pouvoir utiliser la méthode max(int, int).

    Par contre en définissant la méthode Test2::max comme étant statique, je n'ai pas besoin d'une instance pour utiliser cette méthode.

    Est-ce clair ?

  5. #5
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    oueps!
    merci, je comprends mieux.
    j'ai résolu grossièrement mon problème en passant par des variables globales

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Tu sais, il n'y a pas vraiment de différence entre une variable globale et une variable statique de classe, à cela près qu'on peut en règlementer l'accès...

  7. #7
    Membre actif Avatar de keil
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    261
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 261
    Points : 214
    Points
    214
    Par défaut
    le pb c'est qu'à partir d'une methode static j'avais pas accès à une méthode ou un attribut non-static

  8. #8
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Bien sûr, mais là, je ne parle plus de méthode mais de variable: Et là, mon post précédent s'applique.

  9. #9
    Membre éclairé
    Homme Profil pro
    Consultant ERP
    Inscrit en
    Février 2004
    Messages
    644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant ERP

    Informations forums :
    Inscription : Février 2004
    Messages : 644
    Points : 785
    Points
    785
    Par défaut
    Citation Envoyé par keil
    le pb c'est qu'à partir d'une methode static j'avais pas accès à une méthode ou un attribut non-static
    Ce qui est tout à fait normal du fait que lorsque tu utilises une méthode statique, celle-ci ne dépend pas d'une instance de classe.

    Par contre, tu pourrais passer une référence d'une instance de classe comme argument de ta méthode statique, ce qui te permettrait d'avoir accès à certaines informations.

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

Discussions similaires

  1. le mot clef "static"
    Par Kyle128 dans le forum Débuter
    Réponses: 10
    Dernier message: 17/06/2009, 13h38
  2. Utilisation du mot-clef "static"
    Par sir_gcc dans le forum Langage
    Réponses: 3
    Dernier message: 16/04/2007, 11h18
  3. mot clef sql pour nom de champ
    Par bobinou007 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/10/2004, 13h21

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