-

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

Dedalo92

Nuovo Utente
72
3
Hardware Utente
CPU
Intel Core i7 7700k 4.2 Ghz
Dissipatore
Hyper TX3
Scheda Madre
Gigabyte H270 Gaming-3
Hard Disk
SSD Samusng EVO 850
RAM
RAM VENGEANCE 16GB 2400 Mhz (2 blocchi da 8GB).
Scheda Video
GTX 1080 Gigabyte G1 Gaming Edition 8GB
Alimentatore
Corsair CS650M
Sistema Operativo
Windows 10 64 bit
#1
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
345
111
Hardware Utente
Sistema Operativo
Windows 10
#2
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
Hardware Utente
CPU
Intel Core i7 7700k 4.2 Ghz
Dissipatore
Hyper TX3
Scheda Madre
Gigabyte H270 Gaming-3
Hard Disk
SSD Samusng EVO 850
RAM
RAM VENGEANCE 16GB 2400 Mhz (2 blocchi da 8GB).
Scheda Video
GTX 1080 Gigabyte G1 Gaming Edition 8GB
Alimentatore
Corsair CS650M
Sistema Operativo
Windows 10 64 bit
#5
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!
 
3,228
491
Hardware Utente
CPU
Intel Core i5 4670K
Scheda Madre
Asus Z87-Plus
Hard Disk
WD Caviar Green 500GB
RAM
G.Skill Ares 2x4GB 1600MHz
Scheda Video
Sapphire 7850 1GB @ 1050MHz
Scheda Audio
Integrata
Monitor
Acer V193w
Alimentatore
XFX ProSeries 550W Core Edition
Case
CM HAF 912 plus
Sistema Operativo
ArchLinux + KDE - Windows 10
#6
Non c'è alcun motivo per usare i puntatori rispetto a &.
 
Mi Piace: Marcus Aseth

Marcus Aseth

Utente Attivo
345
111
Hardware Utente
Sistema Operativo
Windows 10
#7
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:

Discussioni Simili


Entra