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 :

[conception] empêcher les modifications d'un objets


Sujet :

C++

  1. #1
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut [conception] empêcher les modifications d'un objets
    Remarque: J'hésitais à poser cette question dans le même thread que celui sur le mot clé const, mais je ne pense pas que ce soit la même problématique.

    Alors voilà ma question:

    J'ai 3 classes, A, B et C. A est quelconque. B est définie ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class B
    {
    public:
      B():m_A(new A){}; //le constructeur de B créé une instance de A
    protected:
      A m_A; //l'instance de A appartient à B
    };
    et C, qui doit avoir un pointeur sur B::m_A, est défini ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class C
    {
    public:
      C(A* pA):m_pA(pA){} // le constructeur de C demande un pointeur sur A
    private:
      A* m_pA;
    };
    Pour résumé, nous avons:
    - Une classe B qui possède une instance de A: c'est B qui instancie A et si B est détruit, cette instance de A est détruite également.
    - Une classe C qui possède un pointeur (référence??) sur l'instance de A créée par B.

    Questions:
    1/ Je voudrais que C ne puisse pas modifier l'instance de A dont il possède un pointeur. Comment faire?
    2/ Comment éviter les erreurs possibles dûes au fait que si je détruit B, le pointeur C::m_pA ne sera plus valide?

    J'espère avoir été suffisamment clair. Si ce n'est pas le cas, n'hésitez pas à me demander des précisions.

    Merci
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  2. #2
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    Lut !

    alors pour la première question, il te suffit de déclaré le A* de C comme un const A* ainsi il n'aura qu'un accès en lecture

    pour le second problème, je pense que seul les pointeurs intelligents peuvent être la solution...

    d'un autre côté, si ton C a vraiment besoin d'une instance du A du B... il devrait être soumis à la même durée de vie d'un point de vue conceptuel...

    sinon penche-toi sur les pointeurs intelligents (boost par exemple)
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  3. #3
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Ok, pour le 1, c'est bien ce que je pensais, mais je n'étais pas sûr du fonctionnement du const sur un pointeur.
    Pour le 2 ... c'est bien ce que je craignais

    Encore merci Swoög
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  4. #4
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    2/ Comment éviter les erreurs possibles dûes au fait que si je détruit B, le pointeur C::m_pA ne sera plus valide?
    Je vais peut-être dires des c*******s, je suis moi aussi débutant ^^

    Est-ce que tu ne pourrais pas gérer dans tes objets B une liste des objets C qui pointent vers leur A ?

    Ca permettrait dans le destructeur de B de prévenir les C concernés que tu as détruit A... (par exemple en créant dans la classe C une fonction DeleteA() qui remet le pointeur vers A à NULL)

  5. #5
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    pour le const sur les pointeurs, reporte toi au post que je t'ai donné en lien dans un autre topic, tu verras les différences entre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const A*
    A const *
    A* const
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

  6. #6
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par r0d
    Ok, pour le 1, c'est bien ce que je pensais, mais je n'étais pas sûr du fonctionnement du const sur un pointeur.
    C'est vrai ça, maintenant que tu le dis, je me pose la même question...

    Si le pointeur est contant, ça signifie qu'on ne peut pas changer d'objet pointé (changer de pointeur).
    Mais ça ne signifie pas pour autant que l'on ne peut pas modifier les propriétés de l'objet pointé, si ?

    Est-ce que ce n'est pas la classe A qu'il faut modifier en mettant toutes les fonctions non constantes en private, et en déclarant la classe B friend ?

    EDIT : oups, Swoög est plus rapide que son ombre... Je vais aller voir le lien sur l'autre topic...

  7. #7
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Après lecture du lien sur les Const, j'ai encore une question : quelle est la priorité entre "Const" et l'opérateur de déréférencement * ? ou exprimé différemment, est-ce que Const A* équivaut à (Const A)* ou à Const (A*) ?

    Si j'ai bien compris, pour le reste :
    A Const * : pointeur modifiable sur un objet A constant
    A* Const : pointeur constant sur un objet A modifiable

    Donc si on veux un pointeur constant sur un objet constant, il faudrait "A Const * Const" ?

  8. #8
    Expert éminent
    Avatar de Swoög
    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    6 045
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 6 045
    Points : 8 339
    Points
    8 339
    Par défaut
    est totalement équivalent à donc oui, si on veut un pointeur constant sur un objet constant, il faut :
    ou
    Rédacteur "éclectique" (XML, Cours PHP, Cours JavaScript, IRC, Web...)
    Les Règles du Forum - Mon Site Web sur DVP.com (Développement Web, PHP, (X)HTML/CSS, SQL, XML, IRC)
    je ne répondrai à aucune question technique via MP, MSN ou Skype : les Forums sont là pour ça !!! Merci de me demander avant de m'ajouter à vos contacts sinon je bloque !
    pensez à la balise [ code ] (bouton #) et au tag (en bas)

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

Discussions similaires

  1. [AC-2007] Empêcher les modifications dans un formulaire continue
    Par Oliv'83 dans le forum IHM
    Réponses: 2
    Dernier message: 16/08/2011, 17h02
  2. [conception] Gerer les interactions ente objets
    Par bachir006 dans le forum Développement 2D, 3D et Jeux
    Réponses: 11
    Dernier message: 18/12/2009, 15h41
  3. Réponses: 9
    Dernier message: 23/11/2009, 17h23
  4. Réponses: 3
    Dernier message: 05/05/2008, 12h00
  5. Connaitre les modifications sur les objets
    Par guizmo2025 dans le forum Hibernate
    Réponses: 10
    Dernier message: 07/11/2007, 16h04

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