2013-10-08 24 views
25

A.hpp:Come inizializzare std :: unique_ptr nel costruttore?

class A { 
    private: 
    std::unique_ptr<std::ifstream> file; 
    public: 
    A(std::string filename); 
}; 

A.cpp:

A::A(std::string filename) { 
    this->file(new std::ifstream(filename.c_str())); 
} 

L'errore che ottengo è gettato:

A.cpp:7:43: error: no match for call to ‘(std::unique_ptr<std::basic_ifstream<char> >) (std::ifstream*)’ 

Qualcuno ha qualche intuizione sul motivo per cui questo è che si verificano ? Ho provato molti modi diversi per farlo funzionare, ma inutilmente.

risposta

29

È necessario inizializzare l'elenco membro-inizializzatore:

A::A(std::string filename) : 
    file(new std::ifstream(filename)); 
{ } 

Il vostro esempio è stato un tentativo di chiamare operator() su un unique_ptr che non è possibile.

Aggiornamento: BTW, C++ 14 ha std::make_unique:

A::A(std::string filename) : 
    file(std::make_unique<std::ifstream>(filename)); 
{ } 
+2

chiamano alternativa, il() '' funzione di ripristinare il 'file' per assegnare il' unique_ptr' se avete bisogno di fare qualche controllo nel costruttore in anticipo. – gigaplex

+0

Non è necessario utilizzare necessariamente l'elenco di inizializzazione dei membri. È più preferibile però. – JohnJohn

+1

@JohnJohn, se stai usando Pimpl, dovresti usare l'elenco di inizializzatore dei membri, dato che std :: unique_ptr è const. – csguth

4

Si può fare in questo modo:

A:A(std::string filename) 
    : file(new std::ifstream(filename.c_str()) 
{ 
}