2012-04-27 5 views
17

Ich versuche einen Weg zu finden, um fout oder cout an eine Funktion zu übergeben. Ich weiß, dass es logisch einfache Möglichkeiten gibt, damit umzugehen, wie ifs in jede Funktion zu setzen, die Daten ausgibt oder einfach nur die Funktion in beide Richtungen schreibt. Dies scheint jedoch primitiv und ineffizient zu sein. Ich glaube nicht, dass dieser Code jemals funktionieren würde, ich stelle ihn hier, um sicherzustellen, dass es leicht ist, zu sehen, was ich "gerne" machen würde. Bitte beachten Sie, dass ich eine Algorithmus-Design-Klasse mit C++ nehme, ich bin in keiner Weise ein erfahrener C++ - Programmierer. Meine Klasse beschränkt sich auf die Header, die Sie sehen.Ist es möglich, cout oder fout an eine Funktion zu übergeben?

#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; 
} 

Antwort

33

Diese beiden dies von ostream erben so versuchen:

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

Dann in main, übergeben Sie das Objekt (cout oder was auch immer) und es sollte gut funktionieren.

+0

Es funktioniert! Ich wusste, dass es nicht so schwer sein konnte wie ich es machte. Vielen Dank! – ChiefTwoPencils

+3

Kein Problem. Sehen Sie sich http://en.cppreference.com/w/cpp/io/basic_ostream für die Basisklasse an. –

+0

@Kevin Nach dem Lesen des Links, den Sie gaben, denke ich, dass die Funktion 'stream' zurückgegeben als Argument zurückgegeben werden sollte:' std :: ostream & sayHello (std :: ostream & stream) {zurück Stream << "Hallo Welt";} ' – GingerPlusPlus

12

Ja. Lassen Sie Ihre Funktion

sein
sayhello(std::ostream &os); 

Dann wird in der Funktion geben Sie os anstelle von xout verwenden können.

(. By the way, using namespace std den gesamten std-Namespace-Dumps und empfohlen ist kein using std::cout und dergleichen ist alles in Ordnung, aber.)

+0

Danke. Ich habe bemerkt, dass das Format die Konvention zu sein scheint. Also, erstellt ein 'using std :: cout 'eine" Verknüpfung ", die es ermöglicht,' cout' zu verwenden, aber den Rest des std-Namensraums intakt zu lassen? – ChiefTwoPencils

+0

@RobertoWilko: Das stimmt. Mit 'using std :: cout 'wird der Name' cout' in den aktuellen Namespace zur sofortigen Verwendung eingeführt (was bedeutet, dass Sie dann auch nicht auf eine lokale Variable namens 'cout' zugreifen können, falls es eine gibt). – thb

Verwandte Themen