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 :

donnée membre constante à l'extérieur de la class


Sujet :

C++

  1. #1
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Par défaut donnée membre constante à l'extérieur de la class
    Bonjour à tous,
    est-il possible d'avoir une donnée membre d'une class déclarée dans la partie public, modifiable par les fonctions membres et qui serait seulement accessible en lecture seule (non modifiable) à l'extérieur de la class, du style:
    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 point {
       public:
       int var;
       void modvar(int);
    };
    point::modvar(int y)
    {
    var=y.2;
    }
    //-----------------------------------------------------------------------------
    int main()
    {
    point pt;
    int z=pt.var;   // acces en lecture
    pt.var=2;             // refusé 
    }
    Cela pour évité de déclarer ma variable en private et fournir sa valeur par une fonction membre.

    Merci

  2. #2
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Par défaut
    Merci de ta réponse mais comme je l'ai signalé:
    Cela pour évité de déclarer ma variable en private et fournir sa valeur par une fonction membre.
    je ne voudrais pas utiliser cette méthode.

  3. #3
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    La méthode propre c'est de mettre var en protected/private et de fournir un accesseur. Pourquoi ne veux-tu pas procéder ainsi ? Le reste c'est de la vilaine bidouille, et c'est sans garantie.

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Février 2004
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique

    Informations forums :
    Inscription : Février 2004
    Messages : 35
    Par défaut
    Je t'avoue que j'ai procédé de cette manière (accès par accesseur), ma question était plus par curiosité/compréhension que un problème à résoudre.
    Merci de ta réponse.

  5. #5
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Bon ben si c'est par curiosité tu peux faire ç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
    18
    19
    20
    class Point
    { 
    public: 
        Point() : var( 10 ) {} // nécessaire...
        const int var; // lecture seule, enfin, normalement...
     
        void set_var( int Val ) // cast barbare pour modifier...
        {
            static_cast<int>( this->var ) = Val;
        }
    }; 
     
    int main()
    {
        Point p;
        p.set_var( 15 ); // ok
        // sauf que on peut le faire ici aussi le cast...
        static_cast<int>( p.var ) = 20;
        cout << p.var << '\n';;
    }
    Mais si tu as le mutator, naturellement on s'attend à l'accesseur. Et comme tu peux le voir, le const dérange, mais n'empêche pas de modifier.

  6. #6
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 287
    Par défaut
    En exportant un proxy ?
    Code vite pondu et vite testé:
    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
    53
    54
    55
    56
    57
    58
    59
    #include <iostream>
     
    template <typename T>
    struct RO_proxy
    {
        operator const T() const { return v_; }
        RO_proxy(T const& v) : v_(v) {}
    private:
        T const & v_;
    };
     
    struct toto
    {
        toto() : entier_(0), entier(entier_) {}
        void next() { ++entier_; }
     
    private:
        int           entier_;
    public:
        RO_proxy<int> entier;
    };
     
    int main (int argc, char **argv)
    {
        toto t;
     
        std::cout << t.entier << std::endl;
        t.next();
        std::cout << t.entier << std::endl;
     
        // t.entier = 2;
        // est interdit car on ne peut copier des RO_proxy entre eux...
        // 2 est implicitement converti en RO_proxy, mais ces derniers
        // ne sont pas assignables => refusé
     
        int i = 41;
        RO_proxy<int> p = i;
        ++i;
        std::cout << p << std::endl;
        // p = 12;
        i = t.entier;
        std::cout << p << std::endl;
     
        // p = t.entier; 
        // est interdit car on utilise une référence => non assignable
     
        RO_proxy<int> q = t.entier;
        t.next();
        std::cout << q << std::endl;
     
        // Aussi inutile que cela puisse être, ceci est accepté
        // J'ai quand même un doute quant à sa validité.
        RO_proxy<int> r = 2;
        std::cout << r << std::endl;
     
        std::cout << std::endl;
        return 0;
    }
    // Vim: let $CXXFLAGS='-Wall -pedantic'
    Il est toujours possible de se rajouter des assertions statiques (voir Modern C++ Design/Loki ou boost) si les messages d'erreurs paraissent trop obscurs.


    PS: Aurélien, ne voulais-tu pas utiliser const_cast<> plutôt ?

    NB: divers edits
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  7. #7
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par Luc Hermitte
    PS: Aurélien, ne voulais-tu pas utiliser const_cast<> plutôt ?
    j'étais parti pour, mais à ma grande surprise static_cast ça passe

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/01/2009, 18h09
  2. Donnée membre constante d'une classe en c++
    Par bmmdrs dans le forum C++
    Réponses: 2
    Dernier message: 18/01/2009, 14h11
  3. Réponses: 1
    Dernier message: 26/09/2007, 17h16
  4. Réponses: 1
    Dernier message: 10/02/2006, 12h10
  5. Réponses: 3
    Dernier message: 24/04/2005, 14h19

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