2016-09-02 3 views
-2

Zuvor würde ich die Adresse von fstream-Objekten an alle Funktionen übergeben, einschließlich des Konstruktors, die E/A-Operationen ausführen. Aber ich möchte versuchen, fstream-Objekte als Membervariablen verfügbar zu machen, damit alle nachfolgenden I/O-Operationen diese Variablen verwenden können, anstatt sie als Argumente übergeben zu lassen.Wie kann ich ein Stream-Objekt als Membervariable verwenden?

das folgende Java-Programm vor:

public class A { 
    Scanner sc; 

    public A(Scanner read) { 
     sc = read; 
    } 
} 

Was wäre die C++ Äquivalent sein? Ich habe versucht, diese

class A { 
    ofstream *out; 

    public: 
     A (ofstream &output) { 
      out = output; 
     } 
}; 

tun, aber das gibt mir einen Kompilierungsfehler:

[Error] invalid user-defined conversion from 'std::ofstream {aka std::basic_ofstream}' to 'std::ofstream* {aka std::basic_ofstream*}' [-fpermissive]

+5

Sie können einem Zeiger keine Referenz zuweisen. Das sind verschiedene Dinge. – tkausl

+2

_ "Aber das gibt mir einen Kompilierungsfehler." _ Spezifizieren Sie sich über Kompilierungsfehler. Poste bitte [MCVE]! –

+2

Auch Sie fragen nach der Ausgabe, nicht für die Eingabe wie _scanner_ würde bedeuten. –

Antwort

5

I Verwendung eines Referenztyp als Member-Variable der Klasse vor.

class A { 
    ofstream& out; 

    public: 
     A (ofstream &output) : out(output) {} 
}; 

Es ist sauberer als mit einem Zeiger.

Wenn Sie Objekte vom Typ A Daten aus einem Stream lesen möchten (wie der Name Scanner suggeriert), verwenden Sie eine std::istream.

class A { 
    std::istream& in; 

    public: 
     A (std::istream &input) : in(input) {} 
}; 
+0

Ich habe gerade bemerkt, dass das OP den völlig falschen Baum bellt. Sie wollen Eingabe, nicht Ausgabe. –

+0

@ πάνταῥεῖ, guten Ruf. Glücklicherweise gilt das gleiche Prinzip auch für einen "istream". –

+0

Yup, tut es.) ... –

4

Sie wahrscheinlich

class A { 
    ofstream *out; 

    public: 
     A (ofstream &output) : out(&output) { 
           //^Take the address 
     } 
}; 

Da std::ofstream wollen, ist für Dateien spezialisiert, die noch bessere Anbindung wäre:

class A { 
    ostream *out; 

    public: 
     A (ostream &output) : out(&output) { 
     } 
}; 

So könnten Sie Ihre Klasse verwenden, transparent für nicht Datei orientierte Ausgabenziele als auch, wie

A a(std::cout); // writes to standard output rather than using a file 
Verwandte Themen