2010-03-16 3 views
16
#include <iostream> 
#include <fstream> 
using namespace std; 

int main() { 
    ofstream myfile; 
    myfile.open ("test.txt"); 
    return 0; 
} 

fstream zu öffnen ist aus Iostream abgeleitet, warum sollten wir beide in dem obigen Code enthalten?Warum muss ich sowohl die iostream und fstream Header enthalten müssen eine Datei

Ich entfernte fstream, jedoch gibt es einen Fehler mit Ofstream. Meine Frage ist Ofstream ist abgeleitet von ostream, warum fstream benötigt wird, um es kompilieren zu lassen?

+4

Ist es wirklich notwendig, alles zu betiteln "One questions about ..."? – dmckee

+5

Änderte den Titel in etwas Sinnvolles. @ skydoor: Denken Sie daran, dass der Titel der Frage den Leuten sagen soll, was Ihre Frage * ist *. Nur zu sagen, dass deine Frage tatsächlich eine Frage ist, sagt uns nichts, was wir nicht wussten. – jalf

Antwort

19

Sie müssen fstream einschließen, weil das die Definition der ofstream Klasse ist.

Sie haben Art von dieser nach hinten bekommen: seit ofstream von ostream leitet, die fstream Header enthalten die iostream Header, so dass Sie iostream auslassen könnten und es wäre noch kompilieren. Aber Sie können fstream nicht weglassen, weil Sie dann keine Definition für ofstream haben.

Denken Sie darüber nach. Wenn ich diese in a.h:

class A { 
    public: 
    A(); 
    foo(); 
}; 

Und dann mache ich eine Klasse, die von A in b.h ableitet:

#include <a.h> 

class B : public A { 
    public: 
    B(); 
    bar(); 
}; 

Und dann will ich dieses Programm schreiben:

int main() 
{ 
    B b; 
    b.bar(); 

    return 0; 
} 

Welche Datei müsste ich aufnehmen? b.h offensichtlich. Wie kann ich nur a.h einschließen und eine Definition für B erwarten?

Denken Sie daran, dass in C und C++ include literal ist. Es fügt den Inhalt der enthaltenen Datei wörtlich ein, wo die include Anweisung war. Es ist nicht wie eine höhere Aussage von "gib mir alles in dieser Familie von Klassen".

+0

Können Sie "iostream" wirklich weglassen, wenn Sie "fstream" hinzufügen? Ich bekomme "cout 'wurde in diesem Bereich nicht erklärt" Fehler auch nach der Verwendung von "mit Namespace std". Warum ist das so? – Alby

+1

@Alby Es scheint ['fstream'] (http://gcc.gnu.org/onlinedocs/libstdc++/libstdc++-html-USERS-4.0/fstream-source.html) beinhaltet 'istream' und 'ostream' aber nicht' Iostream. 'iostream' ist im ursprünglichen Beispiel nicht notwendig, nicht weil' fstream' es enthält, sondern weil das Beispiel nichts von 'iostream' verwendet. – piedar

+0

@piedar Ihr Link beschreibt nur das Verhalten von g ++, dies wird vom C++ - Standard nicht benötigt und andere Implementierungen können sich unterscheiden –

5

std::ofstream ist im Header der Standardbibliothek <fstream> definiert.

Sie müssen diesen Header für seine Definition einschließen, damit Sie ihn instanziieren können.

+0

Also warum Ofstream ist von Ostream abgeleitet? – skydoor

+0

Weil es ein Ausgabestrom ist. –

0

Die typedef ofstream und die zugehörige Klassenvorlage sind definiert durch #include <fstream>, so dass Sie diese Kopfzeile benötigen.

Für Ihr aktuelles Programm wird #include <iostream> nicht benötigt. Vielleicht möchten Sie aber Ihr Objekt fstream mit einigen Funktionen verwenden, die auf ostream oder istream s funktionieren.

Diese Funktionen sind nicht durch #include <fstream> definiert und Sie müssen die richtige Kopfzeile für alle Funktionen enthalten, die Sie verwenden. Einige Implementierungen können dazu führen, dass #include <fstream> auch <iostream> enthält, dies wird jedoch vom C++ Standard nicht garantiert.

Zum Beispiel dieser Code:

ofstream myfile; 
myfile.open ("test.txt"); 

myfile << 1; 

erfordert #include <ostream> (oder, da C++ 11, #include <iostream>, die in #include <ostream> bringen garantiert).