56 votes

Pourquoi copier en streaming n'est pas autorisé?

 int main()
{
   std::stringstream s1("This is my string.");
   std::stringstream s2 = s1; // error, copying not allowed
}
 

Je ne pouvais pas trouver une raison pour laquelle je ne peux pas copier stringstream. Pourriez-vous fournir une référence?

80voto

Nawaz Points 148870

La reproduction de TOUT flux en C++ est désactivé par avoir fait le constructeur de copie private.

Tous les moyens, s'il est stringstream, istream, ostream,iostream ou quoi que ce soit.

La copie de flux est désactivé car il ne fait pas de sens. Son très très très important de comprendre ce flux moyens, pour réellement comprendre pourquoi la copie de flux n'a pas de sens. stream n'est pas un conteneur que vous pouvez faire une copie de. Il ne contient pas de données.

Si une liste/vecteur/carte ou tout récipient est un seau, puis stream est un tuyau par lequel des données de flux. Pensez à flot, comme certains le tuyau par lequel vous obtenez des données; une pipe à l'un des côtés est la source (émetteur), de l'autre côté de l'évier (récepteur). Qui est appelé flux unidirectionnel. Il y a aussi des flux bidirectionnel à travers lequel les données de flux dans les deux sens. Alors, quel est-il judicieux de faire une copie d'une telle chose? Il ne contient pas de données. C'est par le biais de laquelle vous obtenez des données.

Maintenant, supposons que pour un certain temps, si la création d'une copie de flux est permis, et vous avez créé une copie de l' std::cin qui est en fait du flux d'entrée. Dire que l'objet copié est - copy_cin. Maintenant demandez-vous : est-il judicieux de lire les données à partir d' copy_cin flux lorsque les mêmes données ont déjà été lues à partir d' std::cin. Non, ça n'a pas de sens, parce que l'utilisateur a entré les données qu'une seule fois, le clavier (ou le périphérique d'entrée) générés les signaux électriques qu'une seule fois et ils coulaient dans tous les autres matériels et de faible niveau de l'Api qu'une seule fois. Comment votre programme de le lire deux fois ou plus?

Par conséquent, la création de la copie n'est pas autorisée, mais la création de référence est autorisé:

std::istream  copy_cin = std::cin; //error
std::istream & ref_cin = std::cin; //ok

Notez également que vous pouvez créer une autre instance de flux et peut utiliser le même sous-jacent de la mémoire tampon qui de l'ancien flux est en cours d'utilisation. Voir ceci : https://ideone.com/rijov

4voto

Himadri Choudhury Points 5300

Pour répondre directement à la question, vous ne pouvez pas copier car le constructeur de copie de la classe stringstream est déclaré privé.

Cela a probablement été déclaré ainsi parce qu'il semble difficile de copier un flux dans la plupart des cas, de sorte qu'aucune des classes de flux ne possède de constructeur de copie publique.

4voto

tvn Points 444

Comme mentionné ci-dessus, vous ne pouvez pas copier de flux, mais si vous en avez besoin, vous pouvez copier des données:

 std::stringstream from;
std::stringstream to;

std::copy(std::istream_iterator<char>(from), std::istream_iterator<char>(),
          std::ostream_iterator<char>(to));
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X