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

Auteur Sujet: [Résolu] Problème avec le constructeur de sf::RenderWindow  (Lu 3743 fois)

0 Membres et 2 Invités sur ce sujet

  • Invité
[Résolu] Problème avec le constructeur de sf::RenderWindow
« le: Octobre 03, 2014, 04:58:57 pm »
Bonjour,
J'ai voulu créer une classe qui gère une RenderWindow (en tant que membre) et ainsi créer un semblant de GUI, mais quand j'essaie d'initialiser la RenderWindow dans la liste d'initialisation, j'ai des erreurs du genre :
undefined reference to `_imp___ZN2sf6StringC1EPKcRKSt6locale'
undefined reference to `_imp___ZN2sf9VideoModeC1Ejjj'
Etc.

J'utilise Code::Blocks 13.12 avec GCC 4.7.1 MinGW.
(click to show/hide)
Et le code :

absWindow.h :
#ifndef ABSWINDOW_H
#define ABSWINDOW_H


#include <SFML/Graphics.hpp>

#include "ButtonsList.h"

namespace glan
{


// A class to handle a window and its buttons and event loop.
// The constructor does NOT show the window. Add window.setVisible(true) in your show() function.

class absWindow : sf::NonCopyable
{
    friend class Button;
    public:
        absWindow(bool destrDeleteButtons = true, \
                  int x = 600, int y = 800, sf::String const& title = "Window");
        // Arguments :
        //
        // x : the height of the window.
        //
        // y : the width of the window.
        //
        // title : the title shown in the title bar of the window.
        //
        // destrDeleteButtons : sets deleteButtons, which defines if the destructor deletes the buttons of the 'buttons' member.

        absWindow(bool destrDeleteButtons = true, \
                  sf::VideoMode const& videoMode = sf::VideoMode(800,600), std::string const& title = "Window");
        // Arguments :
        //
        // videoMode : the video mode of the window.
        //
        // title : the title shown in the title bar of the window.
        //
        // destrDeleteButtons : sets deleteButtons, which defines if the destructor deletes the buttons of the 'buttons' member.

        virtual ~absWindow() = 0;
        // Destructor. If 'resetRect' member is true, deletes all glan::Button in 'buttons' member.


        virtual void show();
        // Shows the window.

        void useBtnsVect(int i = -1);
        // Sets 'btnsVectShown' member at 'i'.

        void close();
        // Closes the window and destroys this.

        virtual void updateDisp();
        // Should call updateButtons().
    protected:
        void updateButtons();
        // Drawn all buttons contained in 'buttons' member at(btnsVectShown), excepts these which are hidden. If buttons[btnsVectShown] is out of range, no button is

        bool deleteButtons;
        int btnsVectShown;
        std::vector<ButtonsList> buttonsLists;
        sf::RenderWindow window;
        sf::Event event;
};

} // namespace glan

#endif // ABSWINDOW_H
 

absWindow.cpp
#include "absWindow.h"

using namespace glan;

absWindow::absWindow(bool destrDeleteButtons, int x, int y, sf::String const& title) : \
    deleteButtons(destrDeleteButtons), btnsVectShown(-1), buttonsLists(), \
    window(sf::VideoMode(x, y), title, sf::Style::Titlebar | sf::Style::Close)
{
    window.setVisible(false);
}

absWindow::absWindow(bool destrDeleteButtons, sf::VideoMode const& videoMode, std::string const& title) :
    deleteButtons(destrDeleteButtons), btnsVectShown(-1), buttonsLists(), \
    window(videoMode, title, sf::Style::Titlebar | sf::Style::Close), event()
{
    window.setVisible(false);
}

absWindow::~absWindow()
{
    if(deleteButtons)
    {
        for(int i(0) ; i < (int)buttonsLists.size() ; i++)
            buttonsLists[i].clear();
    }
}


void absWindow::show()
{
    window.setVisible(false);

    while(window.isOpen())
    {
        updateDisp();
        while(window.pollEvent(event))
        {
            updateDisp();
            if(event.type == sf::Event::Closed)
                window.close();
        }
    }
}

void absWindow::close()
{
    window.close();
    delete this;
}

void absWindow::updateDisp()
{
    window.clear();
    updateButtons();
    // Other drawings...
    window.display();
}

void absWindow::updateButtons()
{
    ButtonsList temp;
    try
    {
        temp=buttonsLists.at(btnsVectShown);
    }
    catch (std::out_of_range const& expt)
    {
        std::cerr<<expt.what()<<std::endl<<"absWindow.cpp::updateButtons()"<<std::endl;
        return;
    }

    for(int i(0) ; i < (int)temp.size() ; i++)
    {
        if(temp[i] != nullptr)
        {
            if(temp[i]->isEnabled())
                temp[i]->checkClicked(event, window);

            if(!temp[i]->isHidden())
                window.draw(*temp[i]);
        }

    }
}
 
« Modifié: Octobre 06, 2014, 10:23:23 pm par Glân de Brylan »

TheKingArthur

  • Invité
Re : Problème avec le constructeur de sf::RenderWindow
« Réponse #1 le: Octobre 06, 2014, 09:25:22 pm »
Pourquoi tu as mis des slash dans les constructeurs ?

Glân de Brylan

  • Invité
Re : Problème avec le constructeur de sf::RenderWindow
« Réponse #2 le: Octobre 06, 2014, 10:02:43 pm »
Des antislash.
Tu ne connais pas ? Ça permet d'indiquer que la ligne d'en dessous fait partie de la ligne en cours, pour éviter de faire des lignes qui font 300 caractères de long. C'est plus lisible.
Ça fait un bout de temps que j'utilise ça et ça ne m'a jamais causé le moindre soucis, donc ce n'est pas la source du problème, si tu te demandais.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Problème avec le constructeur de sf::RenderWindow
« Réponse #3 le: Octobre 06, 2014, 10:13:06 pm »
Oui... mais c'est inutile. Un code C++ n'a pas de concept de fin de ligne, ceci compilerait tout aussi bien :

absWindow
(
bool
destrDeleteButtons =
true,
sf::VideoMode const&
videoMode =
sf::VideoMode(800,600),
std::string const&
title =
"Window"
)
;
;)

Ce n'est que dans les macros que tu as besoin du slash.
Laurent Gomila - SFML developer

Glân de Brylan

  • Invité
Re : Problème avec le constructeur de sf::RenderWindow
« Réponse #4 le: Octobre 06, 2014, 10:23:09 pm »
Ah. J'apprends des choses.
Au fait, le problème est résolu. Vous savez comment ? J'ai enlevé le flag -Weffc++ et là tout fonctionne, 0 error, 0 warnings.
Ce fichu flag est définitivement buggé (au moins sous Code::Blocks).

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : [Résolu] Problème avec le constructeur de sf::RenderWindow
« Réponse #5 le: Octobre 06, 2014, 11:55:55 pm »
Pas sûr que ça ait un rapport. Tu avais peut-être juste besoin d'un rebuild.
Laurent Gomila - SFML developer

Glân de Brylan

  • Invité
Re : [Résolu] Problème avec le constructeur de sf::RenderWindow
« Réponse #6 le: Octobre 07, 2014, 09:04:21 am »
Non, non. J'avais déjà essayé des clean et des rebuild, ça revenait toujours à la même chose. Et je n'ai pas modifié le code entretemps, donc...