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 .
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 .
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?
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 }
dans ce cas, je creerais un objet intermediaire que je copierais dans un champ const
//edit
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 }
on peut modifier un objet en coursde construction a condition qu'il ait deja ete construit, l'exemple marcherait comme ca:
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.
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) { }
Dernière modification par screetch ; 21/10/2012 à 23h26.
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...
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager