将 unique_ptr 传递给对象会引发错误
passing unique_ptr to object throws error
我正在学习构建器设计模式和智能指针。
所以我试图在我的代码中一直使用 smart_ptr 。但是,当我使用 unique_ptr 在 main 中创建实例并将其传递给 Contractor 对象时,它会抛出错误。
如果我在 contractor class 和 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;
}
lavishHouseBldr
是左值,不能移动;您也需要在 lavishHouseBldr
上应用 std::move
,即
Contractor *ctr1 = new Contractor(std::move(lavishHouseBldr));
我正在学习构建器设计模式和智能指针。
所以我试图在我的代码中一直使用 smart_ptr 。但是,当我使用 unique_ptr 在 main 中创建实例并将其传递给 Contractor 对象时,它会抛出错误。
如果我在 contractor class 和 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;
}
lavishHouseBldr
是左值,不能移动;您也需要在 lavishHouseBldr
上应用 std::move
,即
Contractor *ctr1 = new Contractor(std::move(lavishHouseBldr));