Warum ist das Kopieren von Stringstream nicht erlaubt?

Lesezeit: 4 Minuten

Warum ist das Kopieren von Stringstream nicht erlaubt
Benutzer756327

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

Ich konnte keinen Grund finden, warum ich Stringstream nicht kopieren kann. könnten Sie eine Referenz angeben?

  • Falls Sie sich dessen nicht bewusst sind, können Sie mit effektiv eine Kopie erreichen std::stringstream s2(s1.str());.

    – Björn Pollex

    15. Mai 2011 um 20:03 Uhr


  • @Space: Ich denke, das wäre angemessener: std::stringstream s2; s2 << s1.rdbuf();.

    – GManNickG

    15. Mai 2011 um 22:21 Uhr

  • @GManNickG Hat das nicht eine geringere Leistung?

    – StanE

    15. Juni 2016 um 6:55 Uhr

  • @StanE: Als … was? Als der vorherige Kommentar? Ich glaube nicht. Um sicher zu gehen müsstest du messen.

    – GManNickG

    15. Juni 2016 um 15:47 Uhr

  • @StanE: Der einzige Weg, um sicher zu sein, ist zu messen. 🙂

    – GManNickG

    18. Juni 2016 um 16:41 Uhr

Warum ist das Kopieren von Stringstream nicht erlaubt
Nawaz

Das Kopieren von JEDEM Stream in C++ wird deaktiviert, indem der Kopierkonstruktor erstellt wurde private.

Beliebig bedeutet BELIEBIG, egal ob es ist stringstream, istream, ostream,iostream oder Wasauchimmer.

Kopieren von Strom ist deaktiviert, weil es keinen Sinn macht. Es ist sehr, sehr wichtig zu verstehen, was Strom bedeutet, eigentlich zu verstehen, warum kopieren Strom macht keinen Sinn. stream ist kein Container, den Sie kopieren können. Es enthält keine Daten.

Wenn eine Liste / ein Vektor / eine Karte oder ein beliebiger Container ein Eimer ist, dann ist ein Strom ein Schlauch, durch den Daten laufen fließt. Stellen Sie sich einen Strom als ein Rohr vor durch welche Daten Sie erhalten; ein Rohr – auf der einen Seite ist die Quelle (Sender), auf der anderen Seite die Senke (Empfänger). Das nennt man unidirektionalen Stream. Es gibt auch bidirektionale Streams, durch die Daten fließen fließt in beide Richtungen. Was macht es also Sinn, eine Kopie von so etwas zu machen? Es enthält überhaupt keine Daten. es ist durch die Sie Daten erhalten.

Nehmen Sie nun für eine Weile an, ob das Erstellen einer Kopie des Streams erlaubt ist und Sie eine erstellt haben Kopieren von std::cin was in der Tat ein Eingangsstrom ist. Angenommen, das kopierte Objekt ist copy_cin. Fragen Sie sich nun: macht es Sinn, Daten auszulesen copy_cin Stream, wenn dieselben Daten bereits gelesen wurden std::cin. Nein, es macht keinen Sinn, weil der Benutzer die Daten nur einmal eingegeben hat, die Tastatur (oder das Eingabegerät) die elektrischen Signale nur einmal erzeugt hat und sie nur einmal durch alle anderen Hardware und Low-Level-APIs geflossen sind. Wie kann Ihr Programm es lesen? zweimal oder mehr?

Daher schaffen Kopieren ist nicht erlaubt, aber erstellen Hinweis ist erlaubt:

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

Beachten Sie auch, dass Sie eine andere Stream-Instanz erstellen und dieselbe verwenden können darunter liegender Puffer die der alte Stream derzeit verwendet. Sieh dir das an : https://ideone.com/rijov

  • @davka: Der Puffer wird natürlich geteilt. Lesen Sie von einem und es wird vom anderen fehlen.

    – Xeo

    16. Mai 2011 um 6:16 Uhr

  • Die „Schlauch“-Metapher ist nett, aber wo landen dann die Daten, die ich in einen std::stringstream stecke? An diesen Schlauch muss ein Standard-Eimer angeschlossen sein, da ich den Inhalt dieses Eimers abrufen kann, indem ich z. B. std::stringstream::str() ausführe.

    – Chaos_99

    2. September 2013 um 9:14 Uhr

  • Ich sehe nicht, wie sich Ihre Aussage für Iteratoren und Streams unterscheidet, aber Sie können Iteratoren, aber keine Streams kopieren.

    – Benutzer541686

    18. April 2014 um 4:48 Uhr

  • @Mehrdad: Das Design von Iteratoren basiert auf Zeigersemantik (Zeiger sind Iteratoren, erinnerst du dich?). Deshalb sind Iteratoren kopierbar, weil Zeiger kopierbar sind! Sie können das Kopieren für Iteratoren einer bestimmten Kategorie (z. B. Eingabe-Iteratoren) weiterhin selektiv deaktivieren, dies würde jedoch zu Komplexität und Inkonsistenz im Design führen. Beispielsweise sind Iteratoren mit wahlfreiem Zugriff (z. B. Zeiger) auch Eingabe-Iteratoren.

    – Nawaz

    18. April 2014 um 5:00 Uhr


  • Ich verstehe vollkommen, warum Iteratoren kopierbar sind, ich frage oder beschwere mich nicht darüber. Ich sage, dass Streams auf genau dieselbe Weise mit genau demselben Ergebnis kopierbar sein könnten, aber sie sind es nicht … was bedeutet, dass Ihre Antwort wahrscheinlich falsch ist, weil es keinen wirklichen Grund gibt, warum sie nicht dieselbe Semantik haben könnten wie Hinweise beim Kopieren.

    – Benutzer541686

    18. April 2014 um 6:48 Uhr


Um die Frage direkt zu beantworten, können Sie nicht kopieren, da der Kopierkonstruktor für die Stringstream-Klasse als privat deklariert ist.

Es wurde wahrscheinlich so deklariert, weil es in den meisten Fällen umständlich erscheint, einen Stream zu kopieren, sodass keine der Stream-Klassen öffentliche Kopierkonstruktoren hat.

  • Eigentlich ist es der Kopierkonstruktor für ios_base das ist privat, was bedeutet, dass jeder Stream nicht kopierbar ist.

    – Etienne de Martell

    15. Mai 2011 um 20:04 Uhr

Wie oben erwähnt, können Sie keinen Stream kopieren, aber bei Bedarf können Sie Daten kopieren:

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

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

  • Warum nicht s2.str(s1.str()) verwenden?

    – Christian Rau

    16. Mai 2011 um 16:11 Uhr

989120cookie-checkWarum ist das Kopieren von Stringstream nicht erlaubt?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy