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 :

Pointeur change entre constructeur et méthode :x


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut Pointeur change entre constructeur et méthode :x
    Bonjour,

    Je vous pose le problème.

    J'ai une classe A, B, C et D. Le problème apparaît au niveau de la classe D.

    A est la classe qui créer les instances des autres classes et fait les appels principaux.

    Toutes les autres classes (B, C et D) possèdent un pointeur vers la classe A. Cette adresse est passée via le constructeur.

    à D on passe le pointeur vers A. et via ce pointeur on récupère les adresses de B, C et D (via des appels vers A->get_b A->get_c etc..).

    Lors de la création d'un objet D, les adresses pour les classes A, B et C sont correctement récupérées.

    Cependant, lors de l'appel d'une des méthodes de D, ces adresses ont visiblement changées, du moins elles pointent autre part.

    Ce qui est étrange:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    B::methode_de_b()
    {
       std::cout << a << " " << b << " " << c << std::endl;
       d.methode_de_d();
       std::cout << a << " " << b << " " << c << std::endl;
    }
     
    D::methode_de_d()
    {
       std::cout << a << " " << b << " " << c << std::endl;
    }
    me renvoi un truc du style:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    0xAAAAAAAA 0xBBBBBBBB 0xCCCCCCCC
    0xDDDDDDDD 0xEEEEEEEE 0xFFFFFFFF
    0xAAAAAAAA 0xBBBBBBBB 0xCCCCCCCC
    or, le constructeur de D:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    D::D( A* a )
    {
       a = a_;
       b = a->get_b();
       c = a->get_c();
       std::cout << a << " " << b << " " << c << std::endl;
    }
    me renvoi bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    0xAAAAAAAA 0xBBBBBBBB 0xCCCCCCCC
    Comment cela se fait-il ?

    Le code source complet de mon projet est inclu en pièce jointe.

    Les classes et méthodes à regarder sont:

    CGame::work et CPhysics::work

    merci d'avance, car je coince depuis le début de la journée

    source complets:

    http://rapidshare.com/files/199687948/bnb.tar.bz2.html

  2. #2
    Membre émérite

    Inscrit en
    Mai 2008
    Messages
    1 014
    Détails du profil
    Informations forums :
    Inscription : Mai 2008
    Messages : 1 014
    Points : 2 252
    Points
    2 252
    Par défaut
    Salut !
    Malheureusement ton projet ne compile pas. Il manque des header relatifs à la SDL. Mais, je crois quand même avoir compris l'erreur.

    Il me semble que, fondamentalement, le problème vient du fait que tu passes à toutes tes classes un Engine* dans leur constructeur, ce qui revient à leur donner un accès global à tout et n'importe quoi. C'est un sacré bazar. Impossible de savoir qui utilise quoi. Si l'on reecrit les constructeurs, en passant uniquement l'info dont la classe a réellement besoin, l'erreur apparait comme le nez au milieu de la figure.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
        video = new CVideo( );
        sound = new CSound( );
        event = new CEvent( );
        game  = new CGame ( physics ); // oups
        physics = new CPhysics( sound, game);

  3. #3
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Chez moi il compile parfaitement avec les librairies SDL et
    -lSDL
    -lSDLmain
    -lSDL_mixer
    -lSDL_gfx
    (je ne pense pas en oublier mais c'est possible).

    Le soucis c'est que:

    Beaucoup de mes classes ont besoin d'un accès à plus ou moins n'importe quelle singleton des autres classes. (à noter que toutes mes classes sont des singletons à l'heure actuelle). J'ai fait comme cela dans un premier temps afin de gagner du temps de dev et optimiser ensuite :\

    Je viens d'essayer en ne passant que l'adresse de l'instance Game à Physics et j'ai exactement le même soucis

    Edit: Merde. Je dois être trop fatigué. Je n'ai pas directement compris dans ta réponse que tu me donnais exactement la réponse à mon problème.
    Merci beaucoup

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

Discussions similaires

  1. Perte de vector entre constructeur et méthodes
    Par chollier dans le forum SL & STL
    Réponses: 2
    Dernier message: 06/05/2010, 11h44
  2. [FTP] Mode PASV échange entre deux serveurs
    Par coax81 dans le forum Web & réseau
    Réponses: 2
    Dernier message: 10/09/2007, 11h17
  3. échange entre progamme et DLL
    Par GEIIMAN dans le forum C++
    Réponses: 18
    Dernier message: 04/05/2007, 10h43
  4. échange entre select multiple
    Par mgemc2 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 21/08/2006, 15h15
  5. Pointeur sur un constructeur
    Par DamessS dans le forum C++
    Réponses: 4
    Dernier message: 13/06/2006, 20h06

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