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

Langage C++ Discussion :

Classe avec membres const dans un vecteur


Sujet :

Langage C++

  1. #1
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut Classe avec membres const dans un vecteur
    bonjour, pardonnez mon intrusion,

    sans c++11, comment est t-il possible de créer un vecteur d'une structure avec des membres constants sans passer par des pointeurs ?
    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
    #include <vector>
     
    struct S_Foo {
            S_Foo( const float x ) : x( x ) {}
            float x;
    };
     
    class C_Foo {//Marche sans soucis avec des classes
    public:
            C_Foo( const float x ) : x( x ) {}
            const float X() const { return x; }
    private:
            float x;
    };
     
    int main() {
            std::vector < C_Foo > cfootab;
            cfootab.push_back( C_Foo(5));
            cfootab[0].x = 3;// Erreur cfootab[0].x est "constant" (pas d'accès public)
     
            std::vector < S_Foo > sfootab;
            sfootab.push_back( S_Foo(5));// comment rendre sfootab[0].x constant ?
            sfootab[0].x = 3;// modification possible de x
     
            return 0;
    }
    Merci par avance.

  2. #2
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Salut

    A mon avis, sans C++11, je crois que ce n'est pas possible...

  3. #3
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    C'est assez curieux, quand un objet à une sémantique de valeur, ne devrait-on pas ne pas pouvoir modifier ses membres ?!

  4. #4
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Si ce n'est pas copiable et assignable, vector est inutilisable.

  5. #5
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    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
    #include <vector>
     
    struct Foo {
    public:
            Foo( const float x ) : x( x ) {}
            const float x;
    };
     
    int main() {
            Foo c(1.0);             //ok
            Foo c2(c);              //ok
            Foo c3 = c2;            //ok
     
            vector <Foo> fTab;      //ok
            fTab.push_back(1.0);    //pas ok
     
            return 0;
    }
    C'est copiable et assignable mais il refuse.
    Une classe sans setter avec des membres non constants est-elle considérée comme constante ?
    Car dans ce cas là le vecteur marcherait et on respecterait la sémantique !?

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    ^Ceci est copiable, mais pas assignable. J'entends déjà Visual gueuler "could not generate assignment operator".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    En effet, assignable, ce serait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main() {
            Foo c(1.0);             //ok
            Foo c2(2.0);              //ok
            c = c2; //PAS OK DU TOUT
    }

  8. #8
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Merci à vous
    Je vais rééésayer d'installer c++11..

  9. #9
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Tu utilises quel compilateur ?

  10. #10
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    GCC sur code::blocks.
    (Je suis sur windows (par nécessitée), beaucoup on l'air d'utiliser VS, qui lui est à jour je crois, mais c'est encore microsoft )

  11. #11
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Citation Envoyé par PilloBuenaGente Voir le message
    GCC sur code::blocks.
    (Je suis sur windows (par nécessitée), beaucoup on l'air d'utiliser VS, qui lui est à jour je crois, mais c'est encore microsoft )
    En fait non, le support du C++ est moins avancé sur VS que sur GCC. Tu as quelle version de GCC ? Dans tous les cas, tu actives simplement le support du C++11 en ajoutant la directive -std=c++11. Ensuite, les fonctionnalités disponibles dépendent de ta version (voir http://cpp.developpez.com/gbdivers/cpp11/)

  12. #12
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    version 4.7.1 apparemment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Display(const Display&) = delete;
            Display& operator= (const Display&) = delete;
    warning: defaulted and deleted functions only available with -std=c++11 or -std=gnu++11 [enabled by default]
    Également je met ça en attente, j'ai au début tellement tout installé n'importe comment que je ne m'y retrouve plus, je formate, réessaye, et reviendrais vers vous en cas de pépins

    Merci !

  13. #13
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par PilloBuenaGente Voir le message
    version 4.7.1 apparemment.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            Display(const Display&) = delete;
            Display& operator= (const Display&) = delete;

    Également je met ça en attente, j'ai au début tellement tout installé n'importe comment que je ne m'y retrouve plus, je formate, réessaye, et reviendrais vers vous en cas de pépins

    Merci !
    Il faut que tu ailles dans les options du projet de code::blocks (menu "project" -> "build options...") et que tu coche la case "have g++ folow the C++11 ISO c++ standard (-std=c++11)"

    Maintenant, on arrivait à éviter la copie et l'affectation de classes bien avant que C++11 n'y mette son grain de sel avec les fonction marquées "=delete"

    L'idée est que l'on déclarait (SANS LES DEFINIR!!!) le constructeur par copie et l'opérateur d'affectation dans l'accessibilté privée, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class MaClasse
    {
        /* ...*/
        private:
            MaClasse(MaClasse const &);   // déclaré, mais pas défini
            MaClasse & operator = (MaClasse const &); // déclaré mais pas défini
    };
    Nous obtenions alors une merveilleuse erreur du type de "( copy ctor / operator =) is private in this context" et, dans le pire des cas (lorsque la copie/ l'affectation était demandée par une fonction membre), nous obtenions une erreur de référence non définie au plus tard à l'édition des liens
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  14. #14
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Ce n'était qu'un warning....inoffensif..(manque de vocabulaire anglais)
    En fait je l'ai depuis un baille
    Merci à vous d'avoir persisté !!!

    Oui d'ailleurs, j'utilisais ce constructeur de copie et d'affectation dans beaucoup de mes classes, comment savoir avec un "= delete", qu'a un moment donné on ai voulu la copier ou l'affecter si il n'y a plus d'erreurs ?

  15. #15
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 398
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Il y aura toujours une erreur de compilation si on essaie, elle sera même peut-être plus explicite.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  16. #16
    Membre émérite

    Homme Profil pro
    Non disponible
    Inscrit en
    Décembre 2012
    Messages
    478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Non disponible

    Informations forums :
    Inscription : Décembre 2012
    Messages : 478
    Billets dans le blog
    1
    Par défaut
    Merci ! ! C'est repartit !

  17. #17
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Citation Envoyé par gbdivers Voir le message
    A mon avis, sans C++11, je crois que ce n'est pas possible...
    Et en C++11 ?...

  18. #18
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    En faisant rien Suffit de laisser le compilateur faire son boulot

    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
    #include <vector>
    using namespace std;
     
    struct Foo {
    public:
            Foo( const float x ) : x( x ) {}
            const float x;
    };
     
    int main() {
            Foo c(1.0);             //ok
            Foo c2(c);              //ok
            Foo c3 = c2;            //ok
     
            vector <Foo> fTab;      //ok
            fTab.push_back(1.0);    //pas ok
     
            return 0;
    }
    En C++03, tu crées un objet par défaut puis fait une assignation. Tu as l'erreur suivante avec un const :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: non-static const member ‘const float Foo::x’, can’t use default assignment operator
    En C++11, l'objet est déplacé au lieu d'être copié, donc pas de problème

    Remarque : push_back va faire une conversion implicite de double en Foo et faire un move. Et si on utilise par défaut "explicit" (ce qui devrait être le cas par défaut, sauf raison sémantique), alors ça compile pas. Il est préférable d'utiliser emplace_back ici

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/01/2015, 02h30
  2. [Débutant] Ecriture dune matrice avec 2 colonnes dans un vecteur colonne
    Par abel413 dans le forum MATLAB
    Réponses: 12
    Dernier message: 27/06/2013, 10h35
  3. classe avec membre matrix de taille 2*2
    Par manitor dans le forum Boost
    Réponses: 11
    Dernier message: 06/06/2009, 14h04
  4. [PHP 5.0] instancier une classe avec son nom dans une variable
    Par Nnay_ dans le forum Langage
    Réponses: 1
    Dernier message: 12/02/2009, 12h49
  5. membre statique dans une classe
    Par motrin dans le forum VB 6 et antérieur
    Réponses: 4
    Dernier message: 30/12/2005, 15h15

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