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 :

Methodes statiques


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Developpeur
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Par défaut Methodes statiques
    bonjour,

    j'essaie de creer un object static qui pourrait etre appele par plusieurs autres objects. Je bute apparement sur l'initialisation de cet objet car j'obtiens invariablement
    [Linker error] unresolved external .... referenced from <et ici le nom de la definition de mon object statique ....

    bref, je dois louper qque chose.

    Est-ce que qqu'un pourrait me mettre sur la voie ?

    ci-dessous les 3 petits ficheirs sources:
    - unit2 qui implemente la class avec les methods statiques
    - unit 3 qui implement un client de cet objet
    - unit 1 un petit main()
    Code Unit3.h : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //---------------------------------------------------------------------------
     
    #ifndef Unit3H
    #define Unit3H
    //---------------------------------------------------------------------------
    class client
    {
    public:
    client() {}
    ~client() {}
     
    void process (void);
    };
    #endif
    Code Unit3.cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //---------------------------------------------------------------------------
     
    #pragma hdrstop
     
    #include "Unit3.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
     
    #include "unit2.h"
     
    void client::process(void)
    {
     int a = primId::getUserId();
    }
    Code Unit2.h : 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
    //---------------------------------------------------------------------------
     
    #ifndef Unit2H
    #define Unit2H
    //---------------------------------------------------------------------------
    class primId
    {
    public:
            static void newL (int a, int b);
            static int getUserId();
            static int getAgentId();
            static char* getKey();
     
    private:
            static int userId;
            static int agentId;
            static char key[20];
    };
    #endif
    Code Unit2.cpp : 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
    //---------------------------------------------------------------------------
     
    #pragma hdrstop
    #include <string.h>
    #include "Unit2.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
     
    const char *_key = "secretKey";
     
     
    void primId::newL (int a, int b)
    {
            primId::userId = a;
            primId::agentId = b;
            memcpy (key, _key, sizeof(_key));
    }
     
    int primId::getUserId(void)
    {
            return primId::userId;
    }
     
    int primId::getAgentId (void)
    {
            return primId::agentId;
    }
     
    char* primId::getKey(void)
    {
            return primId::key;
    }
    Code Unit1.cpp : 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
    //---------------------------------------------------------------------------
     
    #pragma hdrstop
     
    //---------------------------------------------------------------------------
     
    #pragma argsused
     
    #include "unit2.h"
    #include "unit3.h"
     
    primId obj;
     
    int main(int argc, char* argv[])
    {
            obj.newL(2,3);
    //        primId::newL(2,3);
     
            client aClient;
     
            aClient.process();
     
            return 0;
    }
    //---------------------------------------------------------------------------

    Merci,
    Jacques

  2. #2
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155

  3. #3
    Membre à l'essai
    Profil pro
    Developpeur
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Par défaut RE:
    Merci,

    mais apres lecture de la faq, j'en arrive a la conclusion suivante: comme mon objet statique est defini dans unit2.cpp, et est utilisé par unit3.cpp, ou d'autres, est-ce que donc il faut que je mettre la definition des membres statiques directement dans le .h (un peu comme des templates) ??

    Jacques.

  4. #4
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Ce n'est pas ça.

    De manière générale, on ne met pas de définition dans les .h, seuls les template font exception.

    Donc, dans le .h, déclaration uniquement.

    Par contre, ta variable statique est déclarée dans unit2.h, mais jamais définie. Il faut que tu la définisses quelque part (le bon endroit étant, avec la définition de unit2, donc dans unit2.cpp). En relisant la FAQ, tu dois trouver comment .

    Edit : plus exactement, ton membre est mal défini dans unit2.cpp

  5. #5
    Membre à l'essai
    Profil pro
    Developpeur
    Inscrit en
    Mars 2009
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Mars 2009
    Messages : 4
    Par défaut
    Ah, c'est ca qui me manquait.

    J'ai rajoute les lignes suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const char *_key = "secretKey";
     
    int primId::userId = 0;
    int primId::agentId = 0;
    char primId::key[]="";
    dans unit2.cpp ... et ca roule !!

    Merci,
    Jacques.

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

Discussions similaires

  1. probleme accès methode statique
    Par jpsegret dans le forum Langage
    Réponses: 5
    Dernier message: 02/04/2007, 15h40
  2. namespace VS methodes statiques
    Par olive_le_malin dans le forum C++
    Réponses: 5
    Dernier message: 16/03/2007, 14h14
  3. Réponses: 2
    Dernier message: 02/05/2006, 14h34
  4. Methodes statiques
    Par romeo9423 dans le forum C++
    Réponses: 3
    Dernier message: 01/02/2006, 11h30
  5. [Singleton] difference singleton classe avec methodes statiques
    Par matN59 dans le forum Design Patterns
    Réponses: 6
    Dernier message: 15/01/2006, 11h04

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