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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 397
    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 397
    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
    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 ?...

  8. #8
    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