2016-08-01 3 views
0

verwenden Ich brauche ostream Zeiger in der Klasse, die zum Zeitpunkt der Konstruktion der Klasse erstellt wird.wie Zeiger auf Ostream in Klasse

Mein Code ist:

#include <iostream> 
#include <string> 
#include <vector> 
#include <map> 
#include <cstring> 
#include <climits> 
#include <cstdio> 
#include <fstream> 
using namespace std; 

class test2_t { 
    public: 
     test2_t() 
     { 
      std::filebuf fb; 
      fb.open ("dump.txt",std::ios::out); 
      ostream *output_ = new std::ostream(&fb); 
     } 
     virtual ~test2_t() 
     {} 
     ostream *output_; 
     void printing() 
     { 
      print(output_); 
     } 
     void print(ostream *out) 
     { 
      *out<<"dump data"<<"\n"; 
     } 

    private: 
     /* data */ 
}; 

int main() 
{ 
    test2_t obj; 
    obj.printing(); 
} 

Aber wird immer Segmentation fault ich weiß nicht, warum. Bitte hilf mir.

+3

Überprüfen Sie den Konstruktor erneut, definieren Sie nicht eine *** lokale Variable *** mit dem Namen 'output_' dort? Nicht dass es dein einziges Problem ist. Was denkst du passiert mit dem Zeiger auf die andere lokale Variable 'fb' wenn die Konstruktorfunktion endet? Wohin wird dieser Zeiger zeigen? –

+0

[Ich bekomme] (http://coliru.stacked-crooked.com/a/8be77c35bf928360) * Warnung: unbenutzte Variable 'output_' [-Wunused-Variable] * – chris

+2

Brauchen Sie wirklich einen Zeiger? Zumindest für dieses Beispiel ist ein Mitglied gerade genug. Denken Sie auch daran, 'std :: unique_ptr ' anstelle des einfachen Zeigers zu verwenden, da 'test2_t' offensichtlich den Stream besitzt. – alexeykuzmin0

Antwort

-1

Sie können Ihre construtor Funktion ändern, wie es zu erhalten folgt arbeiten:

test2_t() : output_(new std::ofstream("dump.txt")) {    
    } 

Vergessen Sie nicht, die Ressource in der destructor zu lösen:

virtual ~test2_t() { 
     delete output_; 
    } 
+1

Warum nicht die Initialisierungsliste und Smartpointer verwenden? Und verifizieren Sie, dass die Datei geöffnet ist? – stijn

+0

@stijn Wäre besser einverstanden, aber es reicht einfach so. –

+0

Nein, ist es nicht. Kopiere 'test2_t' und du bist abgespritzt. –

0

Sie den folgenden Fehler gemacht in Ihrem code: Sie haben Ihre "Output" -Variable im Konstruktor "neu deklariert" - so dass der Zeiger ios nur in einer lokalen Variablen im Konstruktor-Bereich gespeichert wird.

ändern Sie diese Zeile: ostream * output_ = neuer std :: ostream (& fb); in: * output_ = neuer std :: ostream (& fb);

Auf diese Weise wird die Member-Variable Ihrer Klasse mit dem richtigen Zeiger gefüllt.

+0

Sie haben Recht, aber das löst das Problem nicht vollständig. Ihr 'ostream' verwendet immer noch ein Datei-Buf, das den Gültigkeitsbereich verlassen hat, und die Klasse verliert immer noch den Stream. –