我想从函数返回类的实现。该功能在库中。我想阻止用户销毁我返回的对象。我怎样才能做到这一点?
编辑:示例。
与世界的接口:
class Base
{
public:
virtual void foo() = 0;
};
Base* GetFoo();
实施 - 内部:
class Bar : public Base
{
public:
void foo() { //Do something}
};
Base* GetFoo()
{
return new Bar
}
答案 0 :(得分:8)
您可以使用私有析构函数并创建一些方法(release()
)以允许以受控方式释放对象。
答案 1 :(得分:2)
并且当您从base派生时回答您的问题,因此您不能将基础析构函数设为私有。您可以通过受保护的析构函数实现您的目标。
答案 2 :(得分:1)
返回shared_ptr<Base>
并自行保留指针的副本。无论用户使用shared_ptr<Base>
做什么,该指针都会使对象保持活动状态。您甚至可以考虑返回weak_ptr<Base>
,以强调对象的生命周期仅受您的想法影响。
答案 3 :(得分:0)
你为什么要那样做?用户应该获得返回对象的副本,并且应该由他们决定是否分配或取消分配副本。
答案 4 :(得分:0)
在清洁装满的枪时,您不能禁止图书馆的用户自己腿部射击。即即使你返回一个常量引用,也可以从中获取地址然后delete
。因此,即使在这种情况下,您也应该使代码保持稳定。
P.S。私有析构函数(@ nc3b)对类的进一步使用施加了限制(例如,不再使用本地非动态实例),因此请明智地考虑它们。
答案 5 :(得分:0)
如果你return
的内容是new
个对象,那么就没有理由要求用户阻止用户delete
。
但是,您不应该对删除责任留下任何疑问。相反,要么使用智能指针返回值,要么使用多态pImpl模式(其中非多态包装器包含指向多态实现的智能指针 - 通常是提供值语义的智能指针,例如this而不只是返回派生实例。