Frage

Warum macht folgendes nicht:

#include <iostream>
#include <fstream>
#include <stack>

std::stack<std::ifstream> s;

-PT

War es hilfreich?

Lösung

std::stack (wie alle STL-Container) verlangt, dass der darin enthaltenen Typ „zuordenbar“ sein. In STL-sprechen, das heißt, es muss eine Kopie Konstruktor und eine operator=. std::ifstream hat keines von beiden.

Sie können sich vorstellen, warum Sie wollen nicht in der Lage sein, zu kopieren und vergeben I / O-Streams; die Semantik von dem, was passieren soll, wenn es zwei Kopien des gleichen Stromes ist nicht offensichtlich. Sollte ein Lesen von oder Schreiben auf eine Einfluss auf die Position der anderen kopieren? Sollten Schließen einen Bach in der Nähe des anderen? etc.

Wenn Sie „einen Container von std::ifstreams“ haben wollen, dann, was Sie sollten wirklich machen ist „ein Container von std::ifstream*s“. Nicht konstante Zeiger sind immer belegbar. Der Nachteil ist, dass in diesem Fall natürlich, Sie müssen sicherstellen, dass Sie die Zeiger selbst vor zerstörenden den Behälter löschen, da der Behälter nicht tun wird für Sie.

Andere Tipps

Da Ströme nicht kopierbar sind, können Sie tecxhnicaly sie in Standardcontainer setzen.

Aber wir können durch storeing Zeiger auf den Stream zu umgehen, dass. Aber Sie nicht wollen, Zeiger auf Ströme speichern (vor allem, wenn sie dynamisch zugewiesen werden) in einem Standard-Container. Also haben wir nach einer Lösung zu suchen Verstärkung.

-Boost hat das Konzept der Zeiger-Container.
Auf diese Weise können Sie ein Objekt dynamisch zuzuweisen und den Zeiger in dem Zeiger Container zu speichern, die dann das Eigentum an dem Objekt nimmt und gibt Ihnen Zugriff auf das dynamische Objekt, als ob es das Objekt waren (eher als ein Zeiger).

Da der Zeiger Container Besitz nimmt Sie don t Grund zur Sorge über das Objekt zu löschen. Der Behälter wird das tun.

Weil es den Zugriff auf die enthaltenen Objekte als Objekte gibt, anstatt Zeiger es Ihnen, den Strom in Standard-Algorithmen in einer natürlicheren fashon (campared mit einem Behälter von Zeigern) zu verwenden.

Sichern von Tyler hier (nach der Abstimmung +1).

Die stl Container Kopien machen alle über den Ort der Objekte, die Sie ihnen geben. Wenn Sie möchten, können Sie damit umgehen, indem sie spezielle Objekte mit sorgfältig gearbeiteten Kopierkonstruktoren und destructurs mit Referenzzählung und so weiter geben.

Im Allgemeinen ich auf diese Weise zu viel Mühe finden. So wie eine Faustregel verwendet nur kleine Gegenstände in den Behältern. Wenn Sie einen Stapel von Strukturen oder Klassen zu machen, verwenden Sie Zeiger , um sie statt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top