2010-11-02 11 views
7

W jaki sposób można byłoby rzucić ifstream do istream. Myślę, że skoro ifstream jest dzieckiem istream, powinienem być w stanie to zrobić, ale mam problemy z takim zadaniem.Konwersja ifstream do istream

std::istream & inputStr = std::cin; 
    std::ostream & outputStr = std::cout; 
    if(argc == 3){ 
    std::fstream inputFile; 
    inputFile.open(argv[1], std::fstream::in); 
    if(!inputFile){ 
     std::cerr << "Error opening input file"; 
     exit(1); 
    } 
    inputStr = inputFile; 
..... 
} 
+0

http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cpp/2004-09/0856.html – DumbCoder

+0

Rzeczywiście można bezpośrednio przypisać je, ale jeśli masz problemy, ty powinien opublikować swój kod, abyśmy wiedzieli, co jest nie tak. – casablanca

+0

Nie powinieneś tego robić. Możesz po prostu użyć strumienia plików w dowolnym miejscu, w którym istream jest potrzebny, a kompilator wykona rzutowanie automatyczne dla ciebie. –

Odpowiedz

1

Spróbuj:

std::ifstream* myStream; 
std::istream* myOtherStream = static_cast<std::istream*>(myStream); 
myOtherStream = myStream; // implicit cast since types are related. 

Te same prace, jeśli masz odniesienia (&) do rodzaju strumienia, jak również. static_cast jest preferowany w tym przypadku, ponieważ rzutowanie odbywa się podczas kompilacji, co pozwala kompilatorowi zgłaszać błąd, jeśli rzutowanie nie jest możliwe (tj. istream nie były podstawowymi typami ifstream).

Dodatkowo, i prawdopodobnie już to wiesz, możesz przekazać wskaźnik/odwołanie do ifstream do dowolnej funkcji akceptującej wskaźnik/odwołanie do istream. Na przykład poniższe nie jest dozwolone w języku:

void processStream(const std::istream& stream); 

std::ifstream* myStream; 
processStream(*myStream); 
+0

Myślę, że 'static_cast' w twoim pierwszym bloku kodu nie występuje w miejscu, więc musi być przypisane do wskaźnika' std :: istream': 'std :: istream * myStream2 = static_cast (myStream); '. –

+1

Dlaczego o Dlaczego o dlaczego przekazać wskaźnik, gdy odniesienie zrobiłoby? –

+0

@Martin: Pokazałem elastyczność tego języka. Ponieważ z pytania PO nie wynikało jednoznacznie, z jakim problemem się on boryka. –

0
std::istream *istreamObj = dynamic_cast<std::istream *>(&ifStreamObj) 
+0

Nie pamiętasz gwiazdki w dynamicznej obsadzie. Myślę, że chodziło o 'std :: istream * istreamObj = dynamic_cast (& ifStreamObj)' –

+1

Nie tylko nie zweryfikowałeś poprawności kodu. Nie ma faktycznej potrzeby obsady. Wyjmij i nadal dobrze się komponuje. Kiedy kompilator działa dla Ciebie, nie ma potrzeby, aby to zrobić samodzielnie. –

+0

Moje szczere przeprosiny. Moje nadgarstki zostały rozcięte, więc żaden śmiertelnik nie może ponownie zobaczyć moich błędów. Zrelaksuj się trochę, co? Dodanie "*" ... – Neil

20

Nie obsada jest konieczna.

#include <fstream> 
int main() 
{ 
    using namespace std; 
    ifstream f; 
    istream& s = f; 
} 
+2

Pomoże to IMHO wspomnieć, że działa to z powodu polimorfizmu, tj. Faktu, że ifstream jest podklasą istream. (Proszę mnie poprawić, jeśli się mylę!) –

+2

@ Lee-Man: PO już o tym wspomniał (terminologia modulo), więc nie. Twoje zdrowie, –

Powiązane problemy