Forum de la communauté SFML

Aide => Réseau => Discussion démarrée par: Borax Kid le Avril 29, 2014, 10:03:05 pm

Titre: [Résolu][TCP] Impossible de faire un vector de TcpSocket ?
Posté par: Borax Kid le Avril 29, 2014, 10:03:05 pm
Bonjour/bonsoir à tous.

Je commence à faire une partie réseau pour mon jeu.
J'en suis pour l'instant à faire l'écoute des connexions entrantes par le serveur, j'ai donc voulu mettre les sockets (il y aura 2 à 4 joueurs, donc 1 à 3 sockets, vu que le joueur 1 est le serveur) dans un vector.
Le problème est que lorsque je veux augmenter la taille du vector avec un .push_back(sf::TcpSocket()), le programme me renvoie une erreur de NonCopyable, pourtant premièrement ce n'est pas une copie (je n'utilise ce vector qu'à cet endroit étant donné que je commence juste le code du serveur) et deuxièmement je pensais que c'était possible car conseillé dans ce tutoriel : http://sfml-dev.org/tutorials/2.1/network-socket-fr.php

Il n'y a pas vraiment de code à montrer mais si ça vous aide à trouver le problème je vous mets quand même ceci : (comme je vous l'ai dit, il n'est utilisé nul part ailleurs)
// .h
std::vector< sf::TcpSocket > m_sockets;

//.cpp
m_sockets.push_back(sf::TcpSocket());
 

Merci beaucoup d'avance ;)
Titre: Re : [TCP] Impossible de faire un vector de TcpSocket ?
Posté par: Laurent le Avril 29, 2014, 10:59:55 pm
Citer
pourtant premièrement ce n'est pas une copie
C'en est une. push_back prend son paramètre par copie, pas par référence. De plus, std::vector copie (déplace en C++11) ses éléments lorsqu'il a besoin de plus de place en mémoire.

Citer
et deuxièmement je pensais que c'était possible car conseillé dans ce tutoriel
Il est en effet conseillé de stocker ses sockets dans un conteneur, mais il n'est pas dit qu'il faut en stocker des copies. Heureusement il y a d'autres moyens de faire ;)

sf::TcpSocket est, comme le message d'erreur l'indique, non-copiable. En effet cela n'aurait aucun sens, techniquement tu ne peux pas dupliquer une socket (et donc potentiellement une connexion active avec un client... bref je te passe les détails, je pense que t'as saisi le truc) comme ça. Donc, il faut que tu évites de copier à tout va tes sf::TcpSocket, et pour ça tu peux utiliser des pointeurs par exemple (de préférence encapsulés dans la classe standard qui va bien : std::unique_ptr ou std::shared_ptr).
Titre: Re : [TCP] Impossible de faire un vector de TcpSocket ?
Posté par: Borax Kid le Avril 30, 2014, 05:22:53 pm
Ah merci c'est aussi simple que ça, je ne savais pas comment fonctionné push_back.