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

Dedalo92

Nuovo Utente
72
3
CPU
Intel Core i7 7700k 4.2 Ghz
Dissipatore
Hyper TX3
Scheda Madre
Gigabyte H270 Gaming-3
HDD
SSD Samusng EVO 850
RAM
RAM VENGEANCE 16GB 2400 Mhz (2 blocchi da 8GB).
GPU
GTX 1080 Gigabyte G1 Gaming Edition 8GB
PSU
Corsair CS650M
OS
Windows 10 64 bit
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?
 

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
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:

Dedalo92

Nuovo Utente
72
3
CPU
Intel Core i7 7700k 4.2 Ghz
Dissipatore
Hyper TX3
Scheda Madre
Gigabyte H270 Gaming-3
HDD
SSD Samusng EVO 850
RAM
RAM VENGEANCE 16GB 2400 Mhz (2 blocchi da 8GB).
GPU
GTX 1080 Gigabyte G1 Gaming Edition 8GB
PSU
Corsair CS650M
OS
Windows 10 64 bit
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!
 

signore del tempo

Utente Èlite
3,228
491
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
HDD
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
GPU
Sapphire 7850 1GB @ 1050MHz
Audio
Integrata
Monitor
Acer V193w
PSU
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
OS
ArchLinux + KDE - Windows 10
Non c'è alcun motivo per usare i puntatori rispetto a &.
 
  • Mi piace
Reazioni: Marcus Aseth

Marcus Aseth

Utente Attivo
404
138
OS
Windows 10
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:

Entra

oppure Accedi utilizzando
Discord Ufficiale Entra ora!

Discussioni Simili