Hier ist wahrscheinlich eine sehr noobish Frage für Sie: Wie (wenn überhaupt möglich) kann ich einen ifstream von einer Funktion zurückgeben?
Grundsätzlich muss ich den Dateinamen einer Datenbank vom Benutzer erhalten, und wenn die Datenbank mit diesem Dateinamen nicht existiert, muss ich diese Datei für den Benutzer erstellen. Ich weiß, wie man das macht, aber nur, indem man den Benutzer auffordert, das Programm nach dem Erstellen der Datei neu zu starten. Ich wollte diese Unannehmlichkeit für den Benutzer vermeiden, aber die folgende Funktion kompiliert nicht in gcc:
%Vor%EDIT: Entschuldigung, ich habe vergessen zu sagen, wo und was der Compilerfehler war:
%Vor%BEARBEITEN: Ich habe die Funktion so geändert, dass sie einen Zeiger zurückgibt, wie Remus vorgeschlagen hat, und die Zeile in main () in "ifstream database = * getFile ()" geändert; Jetzt bekomme ich diesen Fehler nochmal, diesmal aber in der Zeile in main ():
%Vor% Nein, nicht wirklich. ifstream
hat keinen Kopierkonstruktor, und wenn Sie versuchen, einen zurückzugeben, bedeutet das, dass Sie die Instanz in Ihrer Funktion dorthin kopieren, wohin die Rückgabe gehen soll.
Die übliche Problemumgehung besteht darin, einen Verweis auf einen Verweis zu übergeben und diesen Verweis in Ihrer Funktion zu ändern.
Edit: Während dies Ihren Code funktionieren lässt, wird das grundlegende Problem nicht behoben. Im Moment mischen Sie zwei ziemlich unterschiedliche Zuständigkeiten in eine einzige Funktion: 1) Erlangen Sie einen Dateinamen, 2) Öffnen oder erstellen Sie diese Datei. Ich denke, wenn Sie diese trennen, wird der Code einfacher sein und es viel einfacher machen, die Quelle des Problems zu beseitigen, das Sie sehen.
Edit 2: Die Verwendung einer Referenz wie dieser funktioniert perfekt ohne operator=
. Die allgemeine Idee ist etwas wie:
Der Zuweisungsoperator ist in diesem Fall weder notwendig noch sinnvoll - wir verwenden einfach den vorhandenen fstream über die Referenz. Ein operator=
wäre notwendig wenn und nur wenn wir das Argument an den ctor übergeben müssten. Mit einem Stream können wir standardmäßig einen Stream erstellen, der keine Verbindung zu einer Datei herstellt, und anschließend mit open die Verbindung zur Datei herstellen.
ifstream unterstützt keine Semantik zum Kopieren von Konstrukten (das, was die Fehlermeldung im Grunde sagt), so dass Sie keinen ifstream zurückgeben können. Geben Sie stattdessen einen ifstream * zurück und übergeben Sie dem Aufrufer die Verantwortung, den Zuweisungszeiger zu löschen.