2010-03-02 5 views

Antwort

10

std::stack (wie alle STL-Container) verlangt, dass die darin enthaltenen Typ "zuordenbar" sein. In STL-Sprache bedeutet das, dass es einen Kopierkonstruktor und einen operator= haben muss. std::ifstream hat keine von diesen.

Sie können sich vorstellen, warum Sie keine I/O-Streams kopieren und zuweisen möchten; Die Semantik dessen, was passieren sollte, wenn zwei Kopien desselben Stroms vorliegen, ist nicht offensichtlich. Sollte ein Lesen oder Schreiben in eine Kopie die Position der anderen Kopie beeinflussen? Sollte das Schließen eines Stromes den anderen schließen? etc.

Wenn Sie "einen Container von std::ifstream s" haben wollen, dann was Sie wirklich machen sollten, ist "ein Container von std::ifstream* s". Nicht-konstante Zeiger sind immer zuweisbar. Der Nachteil ist, dass Sie in diesem Fall natürlich sicherstellen müssen, dass Sie die Zeiger selbst löschen, bevor Sie den Container zerstören, da der Container das nicht für Sie erledigt.

+0

Sie können jedoch einen Stapel ifstream-Zeiger haben: std :: stacked s; – ALOToverflow

+0

Hervorragend! Vielen Dank. - Prasoon –

0

Backup Tyler hier (nach der Abstimmung +1).

Die STL-Container erstellen Kopien der Objekte, die Sie ihnen geben. Wenn Sie wollen, können Sie damit umgehen, indem Sie ihnen spezielle Objekte mit sorgfältig gestalteten Kopierkonstruktoren und -zerstörern mit Referenzzählung und so weiter geben.

Generell finde ich so viel zu viel Mühe. Als Faustregel gilt, dass nur kleine Objekte in den Containern verwendet werden. Wenn Sie einen Stapel von Strukturen oder Klassen erstellen möchten, verwenden Sie stattdessen Zeiger.

+0

Als Faustregel gilt: 1) nur (höhere) Klassen von Mitgliedern erstellen, die korrekt kopieren (zB 'std :: string', nicht' char * '), 2) sonst Smartpointer speichern (und make sicher, dass die Klasse nicht kopierbar ist). – UncleBens

+0

Auch wenn Sie # 1, in meiner (in der Regel Echtzeit) Arbeit, kopieren große Objekte herum, oder alles, was eine dynamische Zuordnung/Freigabe haben kann, ist eine schlechte Sache. –

+0

In diesem Fall verwenden Sie wahrscheinlich spezielle Speicherpools usw. (da Sie die Zeiger nicht dynamisch zuordnen können), was eine eher spezifische Verwendung von C++ ermöglicht. Würdest du es wirklich als guten Rat für einen Anfänger betrachten, 'vector ' zugunsten von '' zu vermeiden? IMO, der Overhead ist normalerweise egal, außer in sehr spezifischen Szenarien. – UncleBens

2

Da Streams nicht kopierbar sind, können Sie sie technisch in Standardcontainer stellen.

Aber wir können das umgehen, indem wir Zeiger auf den Stream speichern. Aber Sie möchten Zeiger auf Streams nicht speichern (besonders wenn sie dynamisch zugewiesen werden) in einem Standardcontainer. Wir suchen nach einer Lösung.

Boost hat das Konzept der Pointer-Container.
Dies ermöglicht Ihnen, ein Objekt dynamisch zuzuweisen und den Zeiger im Pointer-Container zu speichern, der dann das Eigentum an dem Objekt übernimmt und Ihnen Zugriff auf das dynamische Objekt gibt, als wäre es das Objekt (und nicht ein Zeiger).

Da der Pointercontainer die Eigentümerschaft übernimmt, müssen Sie sich keine Gedanken über das Löschen des Objekts machen. Der Container wird das tun.

Da es den Zugriff auf die enthaltenen Objekte als Objekte und nicht als Zeiger ermöglicht, können Sie den Stream in Standardalgorithmen in einer natürlicheren Weise (zusammen mit einem Container mit Zeigern) verwenden.