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?
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?
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
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.
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.