Partage
  • Partager sur Facebook
  • Partager sur Twitter

[SDL] - Transmission de l'écran entre classe -

Constructeur / Destructeur

Sujet résolu
    12 juillet 2007 à 1:18:59

    Salut à tous !

    Alors voila : je suis en train de programmer un petit jeu, et il se trouve qu'à un moment de l'implémentation, je me retouve face à un problème :


    SDL_Surface* screen;

    // Initialisation d'autre bibliothèques, déclarations de certaines variables ....

    screen = SDL_SetVideoMode(800, 600, 32, SDL_HW_SURFACE | SDL_DOUBLEBUF);


    Nous avons donc un "pointeur sur l'écran". Mais maintenant, imaginons une classe qui blit sur l'écran une image : elle aura besoin de ce pointeur. Donc dans le main :


    screen = SDL_SetVideoMode(800, 600, 32, SDL_HW_SURFACE | SDL_DOUBLEBUF);

    Classe object;

    object.Display(screen);


    Jusque là tout marche impec. Maintenant, si je rajoute dans les attribus de Classe un SDL_Surface*, que je surchage le constructeur pour passer en argument SDL_Surface *screen et que je modifie la liste d'initialisation du constructeur de la classe comme ceci :

    Classe(SDL_Surface *screen) : ptr_Screen(screen){];


    Je dois donc modifier le main de manière à ne plus envoyer screen à la méthode mais au constructeur. Ainsi, notre classe fonctionne, mais si l'on y réfléchis bien, il y a problème : si l'on crée deux instances de Classe, les destructeurs supprimeront les ptr_Screen chacun leur tour, or ils pointent sur la même chose !

    Donc voila je voudrais trouver le moyen déciter ça tout en pouvant envoer screen au constructeur (par référence ?)
    • Partager sur Facebook
    • Partager sur Twitter
      12 juillet 2007 à 11:17:20

      Non, il n'y a pas de problème.

      Ton destructeur détruira le pointeur, mais pas la chose pointée. Si tu veux vraiment être sûr, tu n'as qu'à mettre le pointeur à NULL dans le destructeur, comme ça rien ne pourra être détruit car l pointeur pointe sur rien :p

      Il faut bien penser que chaque classe possède un pointeur sur ton écran et qu'on peut détruire ce pointeur sans détruire l'écran. Si nu ne fais pas de delete ptr_Screen, l'écran ne sera pas détruit.

      • Partager sur Facebook
      • Partager sur Twitter
      Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
        13 juillet 2007 à 9:51:47

        Merci beaucoup mais le problème est que le programme plante tout de même :(
        • Partager sur Facebook
        • Partager sur Twitter
          13 juillet 2007 à 10:04:47

          Dans ce cas c'est qu'il y aune autre erreur. ^^
          • Partager sur Facebook
          • Partager sur Twitter
          Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
            13 juillet 2007 à 10:27:18

            J'ai chercher partout pourtant, et dès que je modifie cette petite ligne de code, le programme tourne impec. Je t'aurais bien posté un peu de code, mais le problème c'est qu'il fait environ 1200 lignes, donc avant de trouver l'erreur, tu n'as pas finis mdr.

            Niveau polymorphisme, je n'ai pas implémenté grand chose, pas de fontions virtuelles, pas d'héritage, rien de cela encore. Ce qui est vraiment bizarre, c'est que si j'enlève ces quelques lignes ça marche, donc je ne comprends pas ...
            • Partager sur Facebook
            • Partager sur Twitter
              13 juillet 2007 à 10:36:20

              Tu es sûr que tu ne fais pas un delete de ton pointeur dans le destructeur ?
              • Partager sur Facebook
              • Partager sur Twitter
              Co-auteur du cours de C++. ||| Posez vos questions sur le forum ||| Me contacter.
                13 juillet 2007 à 11:57:03

                Non, enfin, pas directement.

                En fait, je pense avoir trouvé l'erreur. J'ai bien deux classes qui contiennent chacune un pointeur sur screen. Seulement voila, les attribus de ma classe Menu sont des pointeurs sur Composed (la deuxième classe).

                Initialisés dans le constructeur comme suit :


                play = new Composed("Jouer");
                howPlay = new Composed("Comment jouer3");
                properties = new Composed("Options");
                about = new Composed("A propos ...");
                end = new Composed("Quitter");


                Et le destructeur de menu, il en va de soit :


                delete play;
                delete howPlay;
                delete properties;
                delete about;
                delete end;


                Donc dans ce cas là le pointeur serait donc copié de nombreuses fois ....
                • Partager sur Facebook
                • Partager sur Twitter
                  13 juillet 2007 à 12:27:54

                  Ne t'embête pas pour le pointeur écran et utilise cette fonction:
                  SDL_GetVideoSurface();

                  Elle retourne un pointeur sur l'écran...
                  Pour faire un blit, tu met:
                  SDL_BlitSurface(surface, NULL, SDL_GetVideoSurface(), &position);
                  • Partager sur Facebook
                  • Partager sur Twitter
                    13 juillet 2007 à 16:39:53

                    Merci beaucoup pour cette fonction, mais je préfère quand même avoir des pointeurs plutôt qu'une simple fonction !

                    Mais vraiment merci ;)
                    • Partager sur Facebook
                    • Partager sur Twitter

                    [SDL] - Transmission de l'écran entre classe -

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown