Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Fermer ma fenêtre depuis une autre classe ?  (Lu 2293 fois)

0 Membres et 1 Invité sur ce sujet

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Fermer ma fenêtre depuis une autre classe ?
« le: Décembre 20, 2016, 11:22:53 am »
Bonjour,

J'ai déclaré ma fenêtre "app" en Globale, autrement-dit avant mon int main(), de manière à y avoir accès partout dans le code.

Voici le code en question :

#include <iostream>
#include "KeyGestion.h"

#include <SFML/Graphics.hpp>

using namespace std;
using namespace sf;

#pragma region variables
RenderWindow app(VideoMode(800,600,32),"Test", Style::Titlebar);
KeyGestion K;
#pragma endregion variables

int main()
{
    while(app.isOpen())
    {
        Event event;
        while (app.pollEvent(event))
        {
            if (event.type == event.Closed)
                app.close();
        }
        K.KeyPress();
        app.display();
    }

}
 

Le problème, c'est que lorsque je veux accéder à ma fenêtre "app" pour la fermer depuis une autre classe, ici KeyGestion.CPP, au moment de vouloir appliquer un évènement clavier ( ici pour fermer la fenêtre ), cela ne reconnait pas "app" par l'erreur suivante : error : 'app' was not declared in this scope

Voici KeyGestion.CPP
#include "KeyGestion.h"

#include <SFML/Graphics.hpp>

using namespace std;
using namespace sf;

KeyGestion::KeyGestion()
{

}

KeyGestion::~KeyGestion()
{

}

void KeyGestion::KeyPress()
{
    if (Keyboard::isKeyPressed(Keyboard::Escape))
    {
       app.close();
    }
}

Le but étant de fermer ma fenêtre en pressant la touche ECHAP grâce à une classe spécifique pour la gestion des touches clavier... Merci encore à vous de bien vouloir m'éclairer :-)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Fermer ma fenêtre depuis une autre classe ?
« Réponse #1 le: Décembre 20, 2016, 11:57:47 am »
Ici c'est le forum SFML, on n'est pas censés apprendre aux gens les bases du C++ ;)

Sinon, je pense que "C++ global variables" dans Google sera suffisamment explicite pour résoudre ton problème.
« Modifié: Décembre 20, 2016, 06:19:16 pm par Laurent »
Laurent Gomila - SFML developer

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Re : Fermer ma fenêtre depuis une autre classe ?
« Réponse #2 le: Décembre 20, 2016, 04:33:33 pm »
Bonjour Laurent :-)
Decidement, tu es d'une réactivité exemplaire sur ce forum ..! Je t'en remercie grandement.
J'ai vraisemblablement commis une [tres] grossière erreur, néanmoins, j'aimerais avoir l'éclaircissement du problème car j'avais tenté de passer un RenderWindow en paramètre mais j'obtiens la même erreur ... Faut-il que j'utilise une référence ? ( je n'ai pas essayé, n'étant plus chez moi cet aprem )
Encore merci ;-)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Fermer ma fenêtre depuis une autre classe ?
« Réponse #3 le: Décembre 20, 2016, 06:23:42 pm »
Sans parler du fait que ce genre de design est loin d'être idéal (mais ça tu l'apprendras avec l'expérience, on est tous passés par là), tu abordes ici un point de base du C++ : tout ce que tu utilises doit être déclaré, sans quoi le compilateur va te demander d'où ça sort.

Ajoute ça au début de KeyGestion.h :
extern RenderWindow app;

(et je persiste à dire que si tu avais cherché tout seul comment utiliser les variables globales tu aurais largement eu la réponse sans attendre sur moi ;))
Laurent Gomila - SFML developer

Slash94

  • Jr. Member
  • **
  • Messages: 89
    • Voir le profil
Re : Fermer ma fenêtre depuis une autre classe ?
« Réponse #4 le: Décembre 20, 2016, 07:25:42 pm »
Tu es UN CHEF Laurent ! Cela fonctionne à merveille :-D

Je me suis au préalablement déjà pas mal documenté sur la poo et ait déjà réussi avec succès des petits exos ( comme une mini gestion de banque ou encore d'un garage automobile ), le principal de l'héritage, de l'utilisation du mot-clef virtual etc etc.. je croyais avoir déjà de solides bases mais alors le mot-clef "extern", je ne l'ai jamais vu dans aucune doc pour novice comme moi.

Je suis très heureux d'avoir pris connaissance de ce terme, ça fonctionne parfaitement mais je vais néanmoins aller faire quelques recherches dessus.

Encore merci Laurent  ;D

PS : Durant ma pause au boulot avant de rentrer chez moi et de constater que ça fonctionnait parfaitement, j'avais googlé sur mon téléphone "variables globales C++" , j'étais bel et bien tombé sur le terme "extern", mais j'ai cru comprendre que c'était surtout privilégié dans le langage C..?
« Modifié: Décembre 20, 2016, 07:28:45 pm par Slash94 »