2016-04-19 3 views
-1

Was ich habe, ist eine Aufgabe, zwei Dateien mit einer Funktion zu verketten. Also was ich versuchte zu tun ist:Warum sollten wir Dateien mit Bezug auf Funktionen in C++ übergeben?

Aber ich hatte immer einen Fehler, den ich nicht verstehen konnte. Also änderte ich dies zu:

... 

void concatenateFiles(ifstream &fileA, ifstream &fileB, ofstream &fileAB){ 
    ... 
} 

Und es hat funktioniert, aber ich bin mir nicht ganz sicher warum. Ich nehme an, es hat etwas mit der Unfähigkeit zu tun, auf die Dateien zuzugreifen, wenn sie nicht per Referenz weitergegeben wurden. Vielleicht kann C++ keine Kopie der Datei erstellen, als ob Kopien von anderen Variablen erstellt würden, wenn sie nicht als Referenz übergeben würden? Das ist so weit, wie ich damit komme. Dies ist mein erster Programmierkurs. Wenn ihr die Antwort so einfach wie möglich halten könnt, wäre das großartig!

Danke, Rami.

+1

Ja, ['std :: ifstream'] (http://en.cppreference.com/w/cpp/io/basic_ifstream/basic_ifstream) bietet keinen Kopierkonstruktor. –

+0

Was würde es bedeuten, einen Stream zu kopieren? –

+0

@DavidSchwartz Ich habe das "Stream" -Konzept immer noch nicht vollständig verstanden, daher kann ich noch nicht auf dieser Ebene argumentieren:/ –

Antwort

2

std::ifstream (und andere Stream-Klassen) implementiert keinen Kopierkonstruktor (und das zu Recht). In C++ 11 und später wird der Standardkopierkonstruktor eines Compilers sogar explizit über = delete deaktiviert. Sie können also kein std::ifstream Objekt an einen Parameter durch Wert übergeben, nur per Referenz.

+0

Konstruktor kopieren. Ich habs. Ich schaue mir das an, danke! –

2

Sie können das nicht tun, da die Übergabe nach Wert einen Kopierkonstruktor erfordern würde. Allerdings ist der Copykonstruktor explicitly deleted am std::basic_istream Ebene *

basic_istream(const basic_istream& rhs) = delete; 

Passing durch Zeiger oder durch Bezugnahme eingeschlossen, auf der anderen Seite, nicht Copykonstruktor erfordern, so dass es erlaubt ist.

* Vor Einführung der delete Funktionalität in C++ 11 war der Konstruktor private.

+0

Es wird explizit nur in C++ 11 und später gelöscht. –

+0

@RemyLebeau Danke für den Hinweis. Ich denke immer an C++ 11 Funktionalität als "die neue Standard" und C++ 14 als "die neue Spitze", aber ich bin sicher, es gibt eine Menge von C++ 98 Code draußen. – dasblinkenlight

+0

also ich rate einen Kopierkonstruktor ist wie eine Definition, wie man diese Datei kopiert? Ich bin noch nicht auf diesen Begriff gestoßen. Ich habe erst kürzlich mit dem Unterricht begonnen. –

Verwandte Themen