C++ 将唯一_ptr传递给对象会引发错误

C++ 将唯一_ptr传递给对象会引发错误,c++,c++11,design-patterns,smart-pointers,C++,C++11,Design Patterns,Smart Pointers,我正在学习builder设计模式和智能指针。 因此,我试图在我的代码中一直使用smart_ptr。但当我在main中使用unique_ptr创建实例并将其传递给Contractor对象时,它会抛出错误 如果我用承包商类和主类中的共享ptr替换unqiue ptr。程序运行正常,但未调用析构函数 下面是我在使用unique_ptr时遇到的错误 error: call to implicitly-deleted copy constructor of 'std::unique_ptr<Hou

我正在学习builder设计模式和智能指针。
因此,我试图在我的代码中一直使用smart_ptr。但当我在main中使用unique_ptr创建实例并将其传递给Contractor对象时,它会抛出错误

如果我用承包商类和主类中的共享ptr替换unqiue ptr。程序运行正常,但未调用析构函数

下面是我在使用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))
错误:调用“std::unique\u ptr”的隐式删除副本构造函数
承包商*ctr1=新承包商(lavishHouseBldr);
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1/memory:2621:copy构造函数被隐式删除,因为“unique_ptr”具有用户声明的移动构造函数
_LIBCPP_INLINE_VISIBILITY unique_ptr(unique_ptr&&&uu)_无例外
^
在此处将参数传递给参数“houseBuilder”
承包商(std::unique_ptrhouseBuilder):房屋建筑商(std::move(房屋建筑商))
下面是我的代码

/* 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;
}
/*房屋平面图界面的混凝土类*/
班房
{
私人:
标准:串窗、门、浴室、地板、厨房;
公众:
无效设置窗口(字符串窗口)
{
这个->窗口=窗口;
}
空门(弦门)
{
这个->门=门;
}
~House()
{

cout
lavishHouseBldr
是一个左值,不能移动;您还需要在
lavishHouseBldr
上应用
std::move
,即

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

谢谢。这是可行的。但还是没有调用析构函数。“构造:0x7f9a26c025a0”。这一行被打印出来了,但我希望析构函数也会被调用。@samprat-为什么会被调用?你从来没有在
ctr1
上调用delete。你的程序只是泄漏。std::unique\ptr ctr1(新承包商(std::move(lavishhouse bldr)))成功了works@samprat
ctr1
是一个原始指针,而不是智能指针。您需要手动
删除它。