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 :

[C++14] Problème avec un vector<unique_ptr>


Sujet :

C++

  1. #1
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut [C++14] Problème avec un vector<unique_ptr>
    Bonsoir à tous , je sais que j'ai déjà écrit un post il y à quelque heures mais j'ai un problème sans aucun rapport et que j'essaye de résoudre sans succès depuis hier
    Alors voilà, j'ai des entités et là je gère leur physique, donc je me suis occupé des collions( pour l'instant en externe ), etc.. Et là je m'occupe de la gravité. J'ai donc ce code ci :
    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
     
    void updatePhysics( std::vector<std::unique_ptr<Entity>> &v_entity, sf::Vector2f const& gameSize )
    {
        ...
        std::vector<std::pair<bool, size_t>> entityInFall;
        ///COLLISION TEST
        ...
        for( size_t i{0}; i < v_entity.size(); ++i )
        {
            if( v_entity[i]->position.y > 0 )
            {
                entityInFall.push_back(std::make_pair(true,i));
            }
        }
     
        ///GRAVITY TEST
        ...
    }
    Ce code me donne cette erreur alors que si je le met dans mon main je n'es aucun problèmes. Voici l'erreur en question :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    B:\Workspace\C++\Gravity\Function.cpp|11|error: '(&(& v_entity)->std::vector<_Tp, _Alloc>::operator[]<std::unique_ptr<Entity>, std::allocator<std::unique_ptr<Entity> > >(i))->std::unique_ptr<_Tp, _Dp>::operator-><Entity, std::default_delete<Entity> >()->Entity::position' does not have class type|
    Donc, il prend position pour une class ?
    je comprend pas vraiment l'erreur, qulqu'un peux m'aider ?
    Merci ^^"

  2. #2
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    Personnellement, je n'ai encore jamais travaillé avec les unique_ptr, donc je ne suis pas sûr de pouvoir t'aider efficacement.

    J'ai déjà eu des erreurs ressemblants, je dirai que le compilateur considère ton v_entity[i]->position.y comme une fonction/méthode.

    On arrive à une partie de ton code qui me semble bizarre, c'est quoi ces accolades size_t i{0} ligne 8?

    Je ne sais pas si ton problème vient de là mais je n'est jamais vu ça avant.

    Éclaire moi STP.

  3. #3
    Membre expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    739
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 739
    Points : 3 627
    Points
    3 627
    Par défaut
    Je dirais qu'il manque l'include de la classe Entity.

    @rnr72: la construction avec {} est la forme universalisée des initialisations (direct-list-initialization).

  4. #4
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    jo_link_noir, oui, pour des struct, des listes, tableaux, ... je n'avais jamais vu ça pour initialiser une variable simple dans un for. Merci pour l'info.

  5. #5
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut
    J'ai bien mis l'en-tête Entity.hpp car d'autres membre de cette classe fonctionne ailleurs bien que ce ne soit pas la même utilisation.
    Et pour le size_t i{0} dans le for, il faut savoir que c'est tout simplement du c++ moderne, les accolades, c'est la norme.
    Donc, on ne fait plus unsigned int i = 0, mais unsigned int i{0}
    Bref, du coup vu que j'ai bien inclut mon Entity, où pourrait être le problème ^^ mais en tout cas déjà merci de m'avoir répondu.

  6. #6
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    J'ai appris des choses, c'est cool!

    Pourrais-tu s'il te plait nous fournir Entity.hpp et .cpp.

  7. #7
    Expert éminent sénior

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 031
    Points : 11 477
    Points
    11 477
    Billets dans le blog
    11
    Par défaut
    Moi je dis que c'est pas l'include d'Entity.hpp, mais l'include correspondant au type de Entity::position (il aurait râlé sur Entity, pas sur Entity::position)
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  8. #8
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    Je suis d'accord avec dragonjoker59, c'est pour ça que j'aimerai voir Entity.hpp pour savoir exactement ce qu'est Entity::position.

  9. #9
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut
    J'ai bien lu vos message, donc voici mon code.
    Entity.hpp
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
     
    #ifndef Entity_included
    #define Entity_included
     
    #include <vector>
    #include <SFML/Audio.hpp>
    #include <SFML/Graphics.hpp>
     
    class Entity : public sf::Drawable, public sf::Transformable
    {
    public:
     
        Entity( sf::Texture const &texture, sf::Vector2f const &position, sf::Vector2f const &origin );
        Entity( sf::Texture const &texture, sf::Vector2f const &position );
        Entity( sf::Texture const &texture );
     
        void scale( const sf::Vector2f& factor );
        sf::Vector2f position() const;
     
    private:
     
        float const _fall_velocity;
        float _fall_acceleration;
        sf::Sprite entity_sprite;
        virtual void draw( sf::RenderTarget& target, sf::RenderStates states ) const;
     
     
    };
     
    #endif // Entity_included
    Entity.cpp

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
     
    #include "Entity.hpp"
     
    #define FALL_VELOCITY 0.1
     
    Entity::Entity( sf::Texture const &texture, sf::Vector2f const &position, sf::Vector2f const &origin ) : _fall_velocity{FALL_VELOCITY}, _fall_acceleration{0}
    {
        entity_sprite.setTexture(texture);
        entity_sprite.setOrigin(origin);
        entity_sprite.setPosition(position);
    }
     
    Entity::Entity( sf::Texture const &texture, sf::Vector2f const &position ) : _fall_velocity{FALL_VELOCITY}, _fall_acceleration{0}
    {
        entity_sprite.setTexture(texture);
        entity_sprite.setPosition(position);
    }
     
    Entity::Entity( sf::Texture const &texture ) : _fall_velocity{FALL_VELOCITY}, _fall_acceleration{0}
    {
        entity_sprite.setTexture(texture);
    }
     
    void Entity::scale( const sf::Vector2f& factor )
    {
        entity_sprite.scale(factor);
    }
     
    sf::Vector2f Entity::position() const
    {
        return entity_sprite.getPosition();
    }
     
    void Entity::draw( sf::RenderTarget& target, sf::RenderStates states ) const
    {
        states.transform *= getTransform();
        states.texture = entity_sprite.getTexture();
        target.draw(entity_sprite);
    }
    L'endroit ou j'ai le bug :
    Function.cpp

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
     
    #include "Function.hpp"
    #include <tuple>
    #include <windows.h> // adapter plus tard
     
    void error( std::string const &error ) // utiliser ostream
    {
        HANDLE consoleHandle = GetStdHandle(STD_OUTPUT_HANDLE);
        SetConsoleTextAttribute(consoleHandle, FOREGROUND_RED | FOREGROUND_INTENSITY );
        std::cout << error;
        SetConsoleTextAttribute(consoleHandle, FOREGROUND_RED | FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_INTENSITY );
    }
     
    void updatePhysics( std::vector<std::unique_ptr<Entity>> &v_entity, sf::Vector2f const& gameSize )
    {
        ...
        std::vector<std::pair<bool, size_t>> entityInFall;
        ///COLLISION TEST
        ...
     
        for( size_t i{0}; i < v_entity.size(); ++i )
        {
            if( v_entity[i]->position.y > 0 )
            {
                entityInFall.push_back(std::make_pair(true,i));
            }
        }
    */
        ///GRAVITY TEST
        ...
     
    }
     
    void loadAllTexture( std::map<std::string,sf::Texture> &m_texture )
    {
        sf::Texture t;
        t.loadFromFile("B:/Workspace/C++/Gravity/bin/Release/src/Entity/100.png");
        m_texture["Nebuleux"] = t;
    }
     
    void addMobs( std::string name, std::vector<std::unique_ptr<Entity>> &v_entity, std::map<std::string,sf::Texture> const &m_texture )
    {
        auto it = m_texture.find(name);
        if(it != m_texture.end())
        {
            auto e = std::make_unique<Entity>( it->second, sf::Vector2f(100,100) );
            e->scale(sf::Vector2f(0.17,0.17));
            v_entity.push_back( std::move(e) );
            return;
        }
        error("[ERROR][TEXTURE]The mob with texture name : " + name + " is invalid");// faire gestion logs
    }
    Voilà

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 074
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 074
    Points : 12 120
    Points
    12 120
    Par défaut
    sf::Vector2f position() const;
    Virez-moi ces parenthèses, right now !!!
    C'est une fonction, il faut donc AJOUTER des parenthèses lors de l'appel.

    EDIT: je sais que mon intervention est un peu bourrine et que la vraie option est l'ajout de parenthèses; mais les pouces rouges, c'est un peu beaucoup, non ?

  11. #11
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    J'avais bien raison, Entity::position est une fonction! le voila ton problème


    essaie ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v_entity[i]->position().y

  12. #12
    Membre habitué
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Mai 2014
    Messages
    227
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2014
    Messages : 227
    Points : 162
    Points
    162
    Par défaut
    Citation Envoyé par rnr72 Voir le message
    J'avais bien raison, Entity::position est une fonction! le voila ton problème


    essaie ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    v_entity[i]->position().y
    Mais quesque je suis bête !!!!! Merci à vous ! Je crois que je suis fatigué x)

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

Discussions similaires

  1. [Debutant] problème avec les vectors
    Par julien.63 dans le forum Langage
    Réponses: 6
    Dernier message: 21/12/2007, 22h53
  2. problème avec class vector
    Par abdelmajid_daosabah dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 12/11/2007, 22h40
  3. Problème avec les vector
    Par lostchina dans le forum C++Builder
    Réponses: 3
    Dernier message: 30/03/2007, 10h51
  4. Problème avec std::vector
    Par dhoorens dans le forum SL & STL
    Réponses: 4
    Dernier message: 31/12/2006, 14h27
  5. Problème avec std::Vector
    Par mister3957 dans le forum SL & STL
    Réponses: 8
    Dernier message: 16/02/2006, 10h18

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