代码之家  ›  专栏  ›  技术社区  ›  recipriversexclusion

如何为没有clone()成员的类编写句柄?

  •  1
  • recipriversexclusion  · 技术社区  · 15 年前

    我在下面举一个例子 加速C++ 写一个简单的 Handle 将用作智能指针的类。这使用了 virtual ctor idiom 使用虚拟 clone() 功能。到现在为止,一直都还不错。但是当我想用我的 把手 对于我无法控制的课程 克隆() ?

    书中建议的方法是创建一个全局 clone 功能和用途 模板特化 (这是我第一次看到的东西)所以如果 克隆() 是用一个特定的参数调用的,可以编写代码来处理这种情况。

    我的问题是 :这意味着我必须写一个 克隆() 版本为 每一个 我设想我的用户可以使用的类的类型 把手 用。这似乎很难!有没有更优雅和/或简单的方法来解决这个问题?像auto-ptr或boost::shared-ptr这样的东西如何能够提供这种功能而不产生繁琐的 克隆() 定义?

    为了完整起见,这是我的 把手 类实现:

    template <class T> class Handle
    {
    public:
        Handle() : p(0) {}
        Handle(T* t) : p(t) {}
        Handle( const Handle& s ) :p(0) { if (s.p) p = s.p->clone(); }
        const Handle& operator=( const Handle& );
        ~Handle() { delete p; }
    
        operator bool() { return p; }
    
        T& operator*() { if (p) return *p; else throw std::runtime_error("Handle not bound"); }
        T* operator->() { if (p) return p; else throw std::runtime_error("Handle not bound"); }
    private:
        T* p; 
    };
    

    谢谢!

    1 回复  |  直到 13 年前
        1
  •  2
  •   Billy ONeal IS4    13 年前

    解决这个问题的方法是简单地不写 Handle 对于这类课程。不,真的。

    auto_ptr (如C++ 11所示)永远不需要克隆底层对象,因为 自动PTR 不要复制对象。安 自动PTR 只有一个对象副本,当 自动PTR 复制后,对象的控制权将被转移——该对象不会被复制。

    unique_ptr 从不需要克隆底层对象,因为只有一个 尤尼奎 拥有该对象的。 尤尼奎 不可复制,只能移动。

    shared_ptr 从不需要克隆,因为它也只控制对象的一个副本。抄袭 SelddPPTR 只增加引用计数,当引用计数为零时,将销毁该单个对象。

    一般来说,如果没有办法深度复制您的类控制的资源,那么您应该只将该类设置为不可复制。如果客户机需要传递对类的引用,他们可以将类放在 自动PTR , 尤尼奎 SelddPPTR 他们自己。