DOMANDA C++ Passaggio di ofstream e string al costruttore di una classe

Pubblicità

Dedalo92

Nuovo Utente
Messaggi
72
Reazioni
3
Punteggio
26
Non riesco a passare valori di tipo ofstream e string al costruttore di una classe. Qualcuno può farmi degli esempi corretti così che io possa capire cosa sto sbagliando?
 
Una cosa del genere? (codice sotto)
Nota che non puoi copiare gli stream in maniera semplice (da quel che so), percui sto passando un pointer, e questo significa che prima di usare la classe devi essere sicuro che l' ofstream originale non sia stato distrutto (andato out of scope ad esempio) altrimenti sei nei guai.

Una soluzione forse piu sicura è quella di passare una string con il nome del file output da aprire al constructor, ed inizializzare l'ofstream dentro il constructor così che l'oggetto si occupa di gestire l'ofstream e non deve rischiare passando attraverso un pointer.
Imposti la flag ofstream::app così tutti i tuoi oggetti "appendono" le robe alla fine del file, però assicurati che aprano e chiudano lo stream correttamente ed in ordine, penso dia problemi se hai 2 stream aperti sullo stesso file, ma sinceramente non ne ho idea.

C++:
#include <string>
#include <fstream>
using namespace std;

class MyClass {
public:
    //constructor
    MyClass(ofstream* stream, string s);
    //getter
    ofstream* output()const { return stream_; }
private:
    ofstream* stream_;
};

//constructor definition outside class
MyClass::MyClass(ofstream* stream, string s)
    :stream_{ stream }
{
    *stream_ << s << endl;
}

int main()
{
    ofstream output("output.txt", ofstream::out);
    string data = "data manager created";
 
    MyClass dataManager(&output, data);
}
 
Ultima modifica:
Una cosa del genere? (codice sotto)
Nota che non puoi copiare gli stream in maniera semplice (da quel che so), percui sto passando un pointer, e questo significa che prima di usare la classe devi essere sicuro che l' ofstream originale non sia stato distrutto (andato out of scope ad esempio) altrimenti sei nei guai.

Una soluzione forse piu sicura è quella di passare una string con il nome del file output da aprire al constructor, ed inizializzare l'ofstream dentro il constructor così che l'oggetto si occupa di gestire l'ofstream e non deve rischiare passando attraverso un pointer.
Imposti la flag ofstream::app così tutti i tuoi oggetti "appendono" le robe alla fine del file, però assicurati che aprano e chiudano lo stream correttamente ed in ordine, penso dia problemi se hai 2 stream aperti sullo stesso file, ma sinceramente non ne ho idea.

C++:
#include <string>
#include <fstream>
using namespace std;

class MyClass {
public:
    //constructor
    MyClass(ofstream* stream, string s);
    //getter
    ofstream* output()const { return stream_; }
private:
    ofstream* stream_;
};

//constructor definition outside class
MyClass::MyClass(ofstream* stream, string s)
    :stream_{ stream }
{
    *stream_ << s << endl;
}

int main()
{
    ofstream output("output.txt", ofstream::out);
    string data = "data manager created";
 
    MyClass dataManager(&output, data);
}

Grazie mille, ho risolto!
 
Forse uno c'è
Se ad esempio si volesse cambiare l'ofstream associato alla variabile dentro la classe dopo la creazione, il pointer offre quella flessibilità aggiuntiva, fosse stato "ofstream& stream_;" penso non farebbe.
 
Ultima modifica:
Pubblicità
Pubblicità

Discussioni Simili

Indietro
Top