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 :

std::vector (et sfml, accessoirement)


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Points : 36
    Points
    36
    Par défaut std::vector (et sfml, accessoirement)
    Bonjour,
    Je bricole en c++ de façon occasionnelle et découvre en ce moment la smfl.
    En partant du tuto suivant : http://www.sfml-dev.org/tutorials/2....x-array-fr.php, la partie sur les systèmes de particule
    je tente de coder la classe ParticleSystem dans des fichers ParticleSystem.h et ParticleSystem.cpp, celle ci étant dans l'exemple mise directement dans le main.cpp.

    J'ai un problème avec 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
     
    class ParticleSystem : public sf::Drawable, public sf::Transformable
    {
    public:
     
        ParticleSystem(unsigned int count) :
        m_particles(count),
        m_vertices(sf::Points, count),
        m_lifetime(sf::seconds(3)),
        m_emitter(0, 0)
        {
        }
    ...
    private:
        std::vector<Particle> m_particles;
        sf::VertexArray m_vertices;
        sf::Time m_lifetime;
        sf::Vector2f m_emitter;
    }
    J'ai donc crée un fichier .h dans lequel il y a :
    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
     
    class SystemParticules : public sf::Drawable, public sf::Transformable
    {
    	SystemParticules(unsigned int count); //constructeur
    ...
    	struct Particle
        {
            sf::Vector2f velocity;
            sf::Time lifetime;
        };	
    ...
    	std::vector<Particle> m_particles;
    	 sf::VertexArray m_vertices;
    	 sf::Time m_lifetime;
            sf::Vector2f m_emitter;
    ...
    }
    et un .cpp qui ressemble à cela pour le constructeur:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SystemParticules::SystemParticules(unsigned int count)
    {
        m_particles(count);
        m_vertices = sf::VertexArray(sf::Points, count);
        m_lifetime= sf::Time(sf::seconds(3));
        m_emitter= sf::Vector2f(0, 0);
    }
    J'ai une erreur sur
    logique.

    Je ne comprend pas cette déclaration ou affectation.
    Que viens faire ce count dans m_particles qui sauf erreur est un vector<Particle> ?
    Quelqu'un aurai t il une idée de la syntaxe correcte et/ou un début d'explication ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Hello,

    Citation Envoyé par jahmanzaar Voir le message
    Je ne comprend pas cette déclaration ou affectation.
    Que viens faire ce count dans m_particles qui sauf erreur est un vector<Particle> ?
    Quelqu'un aurai t il une idée de la syntaxe correcte et/ou un début d'explication ?
    Ce count est la taille du vector (vector possède un constructeur prenant un size_type en paramètre indiquant le nombre d'éléments à créer).

    L'exemple utilise la liste d'initialisation, cela permet d'initialiser les membres (et classes parentes) AVANT d'entrer dans le corps du constructeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class ParticleSystem : public sf::Drawable, public sf::Transformable {
    public:
        ParticleSystem(unsigned int count) :
           m_particles(count), // appelle le constructeur de vector prenant un size_type (ce que l'exemple fait)
           ...
        {
             m_particles(count); // appelle l'opérateur()(size_type) sur le vecteur, cet opérateur n'existe pas. (ce que tu fais)
        }
    };
    Attention à la syntaxe donc, ce sont deux choses complétement différentes.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Merci pour ces lumières,

    C'est un peu l'idée que je m'en faisait intuitivement et fort de mon impressionnant bagage en anglais

    Je continu cependant à batailler ...

    Quelle serait la syntaxe dans la corps du constructeur ?

    Je me trompe peut être, mais il me semble pus simple, en vue de manipuler, modifier et bricoler un peu l'exemple que l'ensemble soit initialisé dans le corps.

  4. #4
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Citation Envoyé par jahmanzaar Voir le message
    Quelle serait la syntaxe dans la corps du constructeur ?
    C'est impossible.

    Le constructeur est appelé une fois, si tu ne fournis aucun arguments, c'est le constructeur par défaut qui est appelé, exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class ParticleSystem : public sf::Drawable, public sf::Transformable {
    public:
        ParticleSystem(unsigned int count) { }
    };
     
    // est equivalent à
     
    class ParticleSystem : public sf::Drawable, public sf::Transformable {
    public:
        ParticleSystem(unsigned int count) :
           m_particles() // ctor par défaut
        { }
    };
    Et tout ce qui peut être initialisé dans cette liste d'initialisation doit être dans la liste d'initialisation.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 48
    Points : 36
    Points
    36
    Par défaut
    Merci beaucoup pour ces explications.
    en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //dans le .h :
     SystemParticules(unsigned int count) ;
     
    //et dans le .cpp :
    SystemParticules::SystemParticules(unsigned int count):
        m_particles(count)
    {
        m_vertices = sf::VertexArray(sf::Points, count);
        m_lifetime = sf::Time(sf::seconds(3));
        m_emitter = sf::Vector2f(0, 0);
        std::cout<<m_particles.size()<<std::endl;
    }
    ca marche

  6. #6
    Expert confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2012
    Messages
    1 711
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2012
    Messages : 1 711
    Points : 4 442
    Points
    4 442
    Par défaut
    Ca marche mais tu devrais quand même prendre l'habitude de mettre tout ce que tu peux dans la liste d'initialisation.

    Ici, tout sauf ton cout.

    Autant prendre de bonnes habitudes.

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

Discussions similaires

  1. std::vector : dynamique ou statique, pile et tas
    Par salseropom dans le forum SL & STL
    Réponses: 7
    Dernier message: 24/01/2005, 13h22
  2. std::sort() sur std::vector()
    Par tut dans le forum SL & STL
    Réponses: 20
    Dernier message: 05/01/2005, 19h15
  3. char[50] et std::vector<>
    Par tut dans le forum SL & STL
    Réponses: 9
    Dernier message: 12/10/2004, 13h26
  4. Réponses: 8
    Dernier message: 26/08/2004, 18h59
  5. Sauvegarde std::vector dans un .ini
    Par mick74 dans le forum MFC
    Réponses: 2
    Dernier message: 12/05/2004, 13h30

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