2015-09-17 15 views
9

Sto provando ad aggiungere una funzione di inizializzazione pigra alla mia classe. Non sono molto abile con C++. Qualcuno può dirmi come lo realizzo.Come inizializzare un unique_ptr

La mia classe ha un membro privato definito come:

std::unique_ptr<Animal> animal; 

Ecco il costruttore originale che accetta un parametro:

MyClass::MyClass(string file) : 
animal(new Animal(file)) 
{} 

Ho appena aggiunto un costruttore senza parametri e una funzione Init() . Ecco la funzione Init che ho appena aggiunto:

void MyClass::Init(string file) 
{ 
    this->animal = ???; 
} 

Che cosa ho bisogno di scrivere lì per renderlo equivalente a ciò che sta facendo il costruttore?

+2

Utilizzare ['std :: make_unique (file)'] (http://en.cppreference.com/w/cpp/memory/unique_ptr/make_unique) nell'elenco di inizializzazione dei membri. –

+0

Semplice esempio: http://en.cppreference.com/w/cpp/memory/unique_ptr – cbinder

+0

Per '???' puoi usare 'std :: make_unique (file)'. –

risposta

7
#include <memory> 
#include <algorithm> 
#include <iostream> 
#include <cstdio> 

class A 
{ 
public : 
    int a; 
    A(int a) 
    { 
     this->a=a; 

    } 
}; 
class B 
{ 
public : 
    std::unique_ptr<A> animal; 
    void Init(int a) 
    { 
     this->animal=std::unique_ptr<A>(new A(a)); 
    } 
    void show() 
    { 
     std::cout<<animal->a; 
    } 
}; 

int main() 
{ 
    B *b=new B(); 
    b->Init(10); 
    b->show(); 
    return 0; 
} 
+1

È come fare "make_unique" come suggerito da un altro amico? – dotNET

+5

Migliore è probabilmente 'this-> animal = std :: make_unique (a);' –