如何防止用户破坏对象

时间:2010-12-06 06:12:02

标签: c++ oop

我想从函数返回类的实现。该功能在库中。我想阻止用户销毁我返回的对象。我怎样才能做到这一点?

编辑:示例。

与世界的接口:

class Base
{
   public:
      virtual void foo() = 0;
};

Base* GetFoo();

实施 - 内部:

class Bar : public Base
{
    public:
        void foo() { //Do something}
};

Base* GetFoo()
{
   return new Bar
}

6 个答案:

答案 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而不只是返回派生实例。