2012-04-27 10 views
17

Próbuję znaleźć sposób przekazać fout lub cout do funkcji. Zdaję sobie sprawę, że są logicznie proste sposoby radzenia sobie z tym, jak np. Umieszczanie w dowolnej funkcji, która wyprowadza dane, lub nawet napisanie funkcji w obie strony. Wydaje się to jednak prymitywne i nieefektywne. Nie wierzę, że ten kod kiedykolwiek by działał, umieszczam go tutaj, aby upewnić się, że łatwo jest zobaczyć, co "chciałbym" zrobić. Należy pamiętać, że biorę algorytm projektowania klasy przy użyciu C++, w żaden sposób nie jestem doświadczonym programistą C++. Moja klasa jest ograniczona do korzystania z nagłówków, które widzisz.Czy można przekazać cout lub fout do funkcji?

#include <iostream> 
#include <iomanip> 
#include <fstream> 

using namespace std; 
void helloWorld(char); 
ofstream fout; 

int main() 
{ 
    fout.open("coutfout.dat"); 
    helloWorld(c); 
    helloWorld(f); 

    return 0; 
} 
void helloWorld(char x) 
{ 
    xout << "Hello World"; 
    return; 
} 

Odpowiedz

33

Są zarówno dziedziczyć ostream więc spróbuj tego:

void sayHello(ostream& stream) 
{ 
    stream << "Hello World"; 
    return; 
} 

Następnie w głównej, przekazać obiekt (cout lub cokolwiek innego) i powinno działać dobrze.

+0

To działa! Wiedziałem, że nie może być tak trudne, jak ja to robiłem. Wielkie dzięki! – ChiefTwoPencils

+3

Bez problemu. Sprawdź http://en.cppreference.com/w/cpp/io/basic_ostream dla klasy bazowej. –

+0

@Kevin Po przeczytaniu podanego linku, myślę, że funkcja powinna zwrócić 'stream' podany jako argument ...' std :: ostream & sayHello (std :: ostream & stream) {return stream << "Hello World";} – GingerPlusPlus

12

Tak. Niech twoja funkcja będzie

sayhello(std::ostream &os); 

Następnie w funkcji można użyć os zamiast xout.

(. Nawiasem mówiąc, using namespace std zrzuca całą przestrzeń nazw std i nie jest zalecane using std::cout itp wszystko jest w porządku, choć.)

+0

Dzięki. Zauważyłem, że ten format wydawał się być konwencją. Czy więc 'using std :: cout' tworzy" skrót ", umożliwiający użycie' cout', ale pozostawiając resztę przestrzeni nazw standardowej w takcie? – ChiefTwoPencils

+0

@RobertoWilko: Zgadza się. 'Using std :: cout' wprowadza nazwę' cout' w bieżącym obszarze nazw do natychmiastowego użycia (co, nawiasem mówiąc, oznacza, że ​​nie możesz wtedy uzyskać dostępu do lokalnej zmiennej o nazwie 'cout', jeśli taka istnieje). – thb

Powiązane problemy