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 :

problème de cycle de vie d'un objet


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Points : 38
    Points
    38
    Par défaut problème de cycle de vie d'un objet
    Bonjour,

    j'ai une classe dans laquelle je souhaite renseigné un chemin vers un fichier (jusque là, ça roule). Mais le pb est que l'objet est détruit puis recré pendant l'éxécution du programme . Du coup, le dit programme me demande de manière redondante cette information. Je voudrais savoir s'il est possible de geler l'interrogation dès qu'on a renseigné 1 fois. Je précise qu'il m'est pas possible de mettre ailleurs ce bout de code.

    voilà ce que j'ai fais pour l'instant (la classe qui est appelée régulièrement):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    classe A () {
     
    if (test!=13141){
       string chemin;
       cout << "Fic ? :" ;
       cin>> chemin;
    ...
    }
    ...
    }
    test étant pour l'instant déclaré en variable globale (j'aime pas trop ). Une idée?

  2. #2
    Membre confirmé
    Homme Profil pro
    Consultant MOA
    Inscrit en
    Juillet 2004
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant MOA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2004
    Messages : 289
    Points : 635
    Points
    635
    Par défaut
    Variable statique peut-être ?

  3. #3
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    ....elle est déclaré en statique dans un fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #ifdef GLOBAL
    #define Global
    #else
    #define Global extern
    #endif
     
     
    Global static int test;

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Montre nous le vrai code, car on ne peut rien dire de bien concret qui puisse t'aider avec si peu d'information.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Points : 1 543
    Points
    1 543
    Par défaut
    Salut,

    Citation Envoyé par ostralo Voir le message
    ....elle est déclaré en statique dans un fichier
    Il voulait dire une variable statique locale, style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ...
    static bool initialized = false;
    if( ! initialized )
    {
      std::string chemin;
      std::cout << "Fic ? :" ;
      std::cin>> chemin;
      ...
      initialized = true;
    }
    ...
    MAT.

  6. #6
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    ...oui c'est un truc comme ça

  7. #7
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Comme le dit Mat007, il ne faut pas confondre global static, et static local.
    Une global static signifie que la variable n'existe que pour le fichier, tant qu'une static local signifie que la variable n'est initialisé que la 1e fois (chose que tu veux faire en occurrence).

    Sers-toi donc de sa méthode pour ton problème.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    ...le problème est que l'objet est détruit puis reconstruit de manière redondante donc ça change rien avec une variable static (locale ou globale). Peut-être que mon pb est irrésolvable?

  9. #9
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Citation Envoyé par ostralo Voir le message
    ...le problème est que l'objet est détruit puis reconstruit de manière redondante donc ça change rien avec une variable static (locale ou globale). Peut-être que mon pb est irrésolvable?
    Premièrement:

    Est-ce normal qu'il y ait plusieurs instance de l'objet? Est-ce toi qui le veut ou c'est un effet non désiré? (ce qui semble être le cas).
    La portée de ton objet est-elle suffisante? (Objet construit dans une fonction qui se détruit quand on sort de celle-ci si elle est déclarée de façon statique)


    Deuxièment:

    Je ne vois pas pourquoi la variable static ne te convient pas

    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
    #include <iostream>
     
    using namespace				std;
     
    class					Foo
    {
    public:
    					Foo();
    };
     
    					Foo::Foo()
    {
    	static int			initialized = false;
     
    	if (!initialized)
    	{
    		cout << "Initialisation de la classe ..." << endl;
    		initialized = true;
    	}
    	else
    		cout << "Classe deja initialisee !" << endl;
    }
     
    int					main()
    {
    	Foo				foo1;
    	Foo				foo2;
    	Foo				foo3;
     
    	return EXIT_SUCCESS;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Initialisation de la classe ...
    Classe deja initialisee !
    Classe deja initialisee !

  10. #10
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    Citation Envoyé par Trunks Voir le message
    Premièrement:

    Est-ce normal qu'il y ait plusieurs instance de l'objet? Est-ce toi qui le veut ou c'est un effet non désiré? (ce qui semble être le cas).
    La portée de ton objet est-elle suffisante? (Objet construit dans une fonction qui se détruit quand on sort de celle-ci si elle est déclarée de façon statique)
    ...c'est pas mon choix, je ne maîtrise pas cela (je code dans des sources d'un gros projet dans lequel j'ai atterri)

    Deuxièment:

    Je ne vois pas pourquoi la variable static ne te convient pas
    ...le pb est que (si je reprends ton ex), l'objet Foo est détruit puis recréé, donc il revient sur cette partie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
         if (!initialized)
            {
                    cout << "Initialisation de la classe ..." << endl;
                    initialized = true;
            }
    ce qui veut dire que la variable static int initialized = false; est ré-initialisé, à priori. Mais j'ai l'intuition que mon pb est impossible à résoudre

  11. #11
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Citation Envoyé par ostralo Voir le message
    ce qui veut dire que la variable static int initialized = false; est ré-initialisé, à priori. Mais j'ai l'intuition que mon pb est impossible à résoudre
    FAUX !!!

    Tu as testé le code?

    La variable ne sera initialisée qu'une fois, les autres fois, ça sera comme si cette ligne n'existait pas, elle est toute simplement ignorée.
    Donc quand le 1er objet est instancé, la valeur est false, donc ça exécute ce qu'il y a entre les accolades. Les fois suivantes, initialized sera à true, donc ce qu'il y a entre accolades ne sera pas exécuté !

    Selon toi, quelle est la différence entre:

    static int initialized = false;

    et

    int initialized = false;

    ?

  12. #12
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    ...oui, j'ai testé mais à chaque fois que l'objet est détruit puis recréé,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static int initialized
    reprend la valeur False;

    voici une partie de mon code :

    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
     
     
    class A{
    	class B test;
    	test.LoadPath();
     
    ...
    }
     
    class B:LoadPath(){
     
     static int initialized = false;
     
        cout << "initialized : " << initialized <<endl; // pour afficher la valeur
     
        if (!initialized)
     
          {
                    cout << "Initialisation de la classe ..." << endl;
                    initialized = true;
            }
     
        else
                    cout << "Classe deja initialisee !" << endl;
    }
     
    }
    la partie de code de la classe A est appelée (l'objet est détruit/recréé) régulièrement et à chaque fois, il me repose la question donc j'imagine que static int initialized est ré-initialisée, non? (en tout cas le cout m'indique bien que ça vaut 0) bien que c'est contraire à sa nature qui voudrait une cette variable soit initialisée qu'une seule fois. Il y a un truc qui m'échappe...

  13. #13
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    En effet, c'est bizarre

    Tu peux faire un exemple court compilable de ta problématique pour que je puisse essayer

  14. #14
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Voici un exemple simple et concis :

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include <iostream>
     
    using namespace				std;
     
    class						B
    {
    public:
    	void					funcB();
    };
     
    class						A
    {
    public:
    	void					funcA();
     
    private:
    	B						b;
    };
     
    void						A::funcA()
    {
    	static int				initialized = false;
     
    	cout << "Appel a funcA()" << endl;
     
    	if (!initialized)
    	{
    		b.funcB();
    		initialized = true;
    	}
    }
     
    void						B::funcB()
    {
    	cout << "Appel a funcB()" << endl;
    }
     
    int							main()
    {
    	A						a;
     
    	a.funcA();
    	a.funcA();
    	a.funcA();
     
    	return EXIT_SUCCESS;
    }
    Et voici le résultat:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Appel a funcA()
    Appel a funcB()
    Appel a funcA()
    Appel a funcA()
    Soit, le résultat attendu ...

  15. #15
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    ...ça risque d'être compliqué : c'est un petit bout de code dans un gros projet... le seul truc que j'ai fais c'est de créer une classe qui appel ton bout de code.

    Ma classe A est appelée régulièrement (lors d'initialisation du logiciel). L'objet est détruit/ré-instancié et à chaque fois il détruit avec lui ma classe B (le traître), en tout cas ma variable static ne résiste pas. Bizarre...

  16. #16
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    Tu as posté en même temps que moi, donc n'a pas vu ma réponse.
    Regarde ma réponse plus haut, ça correspond à ce que tu décris, et le comportement est normal ...

  17. #17
    Nouveau membre du Club
    Inscrit en
    Janvier 2006
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 63
    Points : 38
    Points
    38
    Par défaut
    OK, je teste, merci!

  18. #18
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    salut,
    je vois dans tous les réponses le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A
    {
        static bool initialized = false;
    };
    Je croyais qu'il fallait écrire dans le fichier .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A
    {
        static bool initialized;
    };
    et dans le fichier .cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool A::initialized = false;
    <edit> houps... j'ai lu trop vite, c'était une variable static locale à une méthode. Mais essaye quand-même ma solution.</edit>

  19. #19
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Non ça n'améliorera rien, le code suivant :
    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
    class A
    {
        static int n1;
     public:
        A()
        {
            static int n2=0;
            cout << "n1 = " << n1 << endl;
            cout << "n2 = " << n2 << endl;
            n1 = n2 = 1;
        }
    };
    int A::n1 = 0;
     
    int main(int argc, char *argv[])
    {
        {
            A a, b;
        }
        A* p = new A;
        delete p;
        p = new A;
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    donne sur la sortie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    n1 = 0
    n2 = 0
    n1 = 1
    n2 = 1
    n1 = 1
    n2 = 1
    n1 = 1
    n2 = 1
    Appuyez sur une touche pour continuer...
    désolé.

  20. #20
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Une seule instance d'une classe ? Pourquoi tu ne fais pas un singleton ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Problème avec le cycle de vie d'une application
    Par sebagot dans le forum Android
    Réponses: 2
    Dernier message: 29/11/2014, 23h57
  2. Problème avec cycle de vie d'une applet
    Par riadhhwajdii dans le forum Applets
    Réponses: 0
    Dernier message: 16/09/2014, 09h48
  3. Problème de cycle de vie.
    Par Invité dans le forum ASP.NET
    Réponses: 5
    Dernier message: 05/12/2007, 13h09
  4. Problème de gestion d'une collection d'objet
    Par poolky dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 17/02/2006, 21h51
  5. [Cookies] durée de vie de l'objet
    Par ozzmax dans le forum Langage
    Réponses: 13
    Dernier message: 13/01/2006, 21h38

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