2017-05-13 6 views
0

ビルダーのデザインパターンとスマートポインタを学習しています。
私は自分のコードでsmart_ptrを使いこなそうとしています。しかし、私がunique_ptrを使ってmainにインスタンスを作成し、それをContractorオブジェクトに渡すと、エラーがスローされます。オブジェクトにunique_ptrを渡すとエラーが発生する

私は、契約者クラスとmainのunqiue_ptrをshared_ptrに置き換えます。 progは正常に動作しますが、デストラクタは呼び出されません。

以下は、unique_ptrを使用したときのエラーです。以下は

error: call to implicitly-deleted copy constructor of 'std::unique_ptr<HouseBuilder>' 
Contractor *ctr1 = new Contractor(lavishHouseBldr); 

/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:2621: copy constructor is implicitly deleted because 'unique_ptr<HouseBuilder, std::__1::default_delete<HouseBuilder> >' has a user-declared move constructor 
_LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&& __u) _NOEXCEPT 
          ^
passing argument to parameter 'houseBuilder' here 
Contractor(std::unique_ptr<HouseBuilder>houseBuilder): houseBuilder(std::move(houseBuilder)) 

/* Concrete class for the HousePlan interface */ 
class House 
{ 
private: 
    std::string window, door, bathroom, floor, kitchen; 
public: 
    void setWindow(string window) 
    { 
     this->window = window; 
    } 
    void setDoor(string door) 
    { 
     this->door = door; 
    } 
    ~House() 
    { 
     cout <<"destructor House called"<<endl; 
    } 
}; 
/* Builder class*/ 
class HouseBuilder 
{ 
public: 
    virtual void buildWindow() = 0; 
    virtual void buildDoor()  = 0; 
    virtual House* getHouse() = 0; 
    virtual ~HouseBuilder() = 0; 
}; 
HouseBuilder::~HouseBuilder() 
{ 
    std::cout <<"Destructor for housebuilder called"; 
} 
class LavishHouse:public HouseBuilder 
{ 
public: 
    LavishHouse() 
    { 
     house.reset(new House()); 
    } 
    ~LavishHouse() 
    { 
     cout <<"Lavish House Destructor callled"<<std::endl; 
    } 
    void buildWindow() 
    { 
    house->setWindow(" French Windows"); 
    } 

    void buildDoor() 
    { 
     house->setDoor(" woodenDoor"); 
    } 
    House* getHouse() 
    { 
     return house.get(); 
    } 
private: 
    std::unique_ptr<House> house; 
}; 
/* The Director. Consturct director*/ 

class Contractor 
{ 
public: 
    Contractor(std::unique_ptr<HouseBuilder>houseBuilder): houseBuilder(std::move(houseBuilder)) 
    { 

    } 
    /* Contractor(HouseBuilder*houseBuilder): houseBuilder(houseBuilder) 
    { 

    }*/ 
    ~Contractor() 
    { 
     cout <<"destruct contractor"<<std::endl; 
    } 

    House *getHouse() 
    { 
     return houseBuilder->getHouse(); 
    } 

    void buildHouse() 
    { 
     houseBuilder->buildWindow(); 
     houseBuilder->buildDoor(); 
    } 
private: 
    std::unique_ptr<HouseBuilder> houseBuilder; 

}; 

/* Example on how to use the Builder design pattern */ 
int main() 
{ 

std::unique_ptr< HouseBuilder> lavishHouseBldr(new LavishHouse()); 
Contractor *ctr1 = new Contractor(lavishHouseBldr); // error!!!!! 

ctr1->buildHouse(); 
House *house1 = ctr1->getHouse(); 
cout<<"Constructed: "<<house1<< std::endl; 
return 0; 
} 

答えて

0

lavishHouseBldrが移動することはできません左辺値、..です私のコードです。つまり、lavishHouseBldrstd::moveを適用する必要があります。つまり、

Contractor *ctr1 = new Contractor(std::move(lavishHouseBldr)); 
+0

ありがとうございます。できます 。しかし、やはりデストラクタは呼び出されません。 – samprat

+0

"構築:0x7f9a26c025a0"。この行は印刷されますが、デストラクタも呼び出されることを期待していました。 – samprat

+0

@samprat - なぜでしょうか?あなたは決して 'ctr1'で削除を呼びます。あなたのプログラムはちょうどリークします。 – StoryTeller

関連する問題