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 :

Cas de const-science


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Points : 3 892
    Points
    3 892
    Par défaut Cas de const-science
    Bonjour,

    si un attribut doit être constant, mais qu'il doit être initialisé dans le corps du constructeur, comment fait-on ? const_cast ?

    Qu'est-ce qui est recommandé ? J'avoue avoir du mal à placer un const_cast vu la réputation qu'il a .

  2. #2
    screetch
    Invité(e)
    Par défaut
    pourquoi doit-il etre initialise dans le corps du constructeur?

    dans tous les cas ou ca semblait impossile, j'ai reussi a l'initialiser quand meme en faisant une fonction libre. Peux tu montrer ton exemple?

  3. #3
    Membre expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Points : 3 892
    Points
    3 892
    Par défaut
    il doit être déterminé dans le constructeur parce sa valeur est déterminée par un algorithme (avec une connexion réseau) qui manipule l'objet lui-même. Une fonction libre ne fonctionnerait je pense pas puisque déterminer cette valeur nécessite d'utiliser l'objet lui-même... or pour pouvoir l'utiliser il faut qu'il soit initialisé... non ?

    As-t-on le droit de modifier un objet en cours d'initialisation (entendez par là que la liste d'initialisation n'est qu'à moitié exécutée) ?

    L'exemple épuré :
    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 Network
    {
    public:
        Network(sf::IpAddress join);
        Network(const Network&) = delete;
     
        virtual ~Network();
     
    private:
     
        const ServerId m_id = 1;
        std::map<ServerId, std::unique_ptr<sf::TcpSocket>> m_otherServers;
    };
     
    Network::Network(sf::IpAddress join)
    {
        //l'algorithme doit se connecter et donc modifier m_otherServers
        //afin de récupérer la valeur attribuée par le serveur distant à m_id
    }

  4. #4
    screetch
    Invité(e)
    Par défaut
    dans ce cas, je creerais un objet intermediaire que je copierais dans un champ const


    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
    class IntermediateNetwork
    {
        friend class Network;
    public:
        IntermediateNetwork(sf::IpAddress join);
        IntermediateNetwork(const Network&) = delete;
     
        virtual ~IntermediateNetwork();
     
    private:
     
        ServerId m_id = 1;
        std::map<ServerId, std::unique_ptr<sf::TcpSocket>> m_otherServers;
    };
     
    IntermediateNetwork::IntermediateNetwork(sf::IpAddress join)
    {
      // ton code
    }
     
    class Network
    {
    public:
        Network(sf::IpAddress join);
        Network(const Network&) = delete;
     
        virtual ~Network();
     
    private:
         const IntermediateNetwork m_implementation;
    };
     
    Network(sf::IpAddress join)
      : m_implementation(join)
    {
      // maintenant le IntermediateNetwork est const
      // donc le m_serverId aussi
    }
    //edit
    on peut modifier un objet en coursde construction a condition qu'il ait deja ete construit, l'exemple marcherait comme ca:




    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
    class Network
    {
    public:
        Network(sf::IpAddress join);
        Network(const Network&) = delete;
     
        virtual ~Network();
     
    private:
         // ATTENTION, les initialisations sont faites dans l'ordre
         // de leurs declarations dans la classe, donc mettre le
         // champ modifiable en premier
         std::map<ServerId, std::unique_ptr<sf::TcpSocket>> m_otherServers;
         const ServerId m_id = 1;
     
         static ServerId doConnectToIP(std::map& serverList, sf::IpAddress join);
    };
     
    Network::Network(sf::IpAddress join)
     : m_otherServers()
     , m_id(doConnectToIP(m_otherServers, join)
    {
    }
    je ne suis pas sur d'avoir compris exactement quel champ est const et doit etre modifie mais j'espere que ce que j'ai dit ci dessus est assez clair.
    Dernière modification par screetch ; 21/10/2012 à 23h26.

  5. #5
    Membre expert

    Avatar de germinolegrand
    Homme Profil pro
    Développeur de jeux vidéo
    Inscrit en
    Octobre 2010
    Messages
    738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur de jeux vidéo
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : Octobre 2010
    Messages : 738
    Points : 3 892
    Points
    3 892
    Par défaut
    Euh... le premier exemple ne résout pas le problème puisque tu essaies toujours de modifier un const dans le constructeur de Intermediate
    Par contre ton 2e exemple me semble plus pertinent...

  6. #6
    screetch
    Invité(e)
    Par défaut
    ah pardon, je voulais retirer le const de IntermediateNetwork.
    Ensuite tu constifies IntermediateNetwork ce qui rend par ricochet tous les champs constants.
    Edit numero 2

Discussions similaires

  1. [XSLT][JSP] solution technique pour cas typique
    Par Alix_10 dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 04/09/2006, 13h09
  2. Chaines et pointeurs mais pas "const"
    Par hpfx dans le forum C
    Réponses: 9
    Dernier message: 05/10/2003, 20h23
  3. [SYBASE] INFO AU CAS OU...
    Par Zeo_BO dans le forum Sybase
    Réponses: 6
    Dernier message: 29/07/2003, 12h44
  4. [corba] débutant : dans quels cas l'utiliser
    Par jmturc dans le forum CORBA
    Réponses: 2
    Dernier message: 10/10/2002, 08h58

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