如何为不使用';你没有clone()成员吗? 我在一个加速C++中编写了一个例子,编写一个简单的句柄类,它将充当智能指针。这将使用使用虚拟的clone()函数。到现在为止,一直都还不错。但是,当我想将我的句柄用于我不控制但不提供clone()的类时,该怎么办

如何为不使用';你没有clone()成员吗? 我在一个加速C++中编写了一个例子,编写一个简单的句柄类,它将充当智能指针。这将使用使用虚拟的clone()函数。到现在为止,一直都还不错。但是,当我想将我的句柄用于我不控制但不提供clone()的类时,该怎么办,c++,clone,C++,Clone,书中建议的方法是创建一个全局的clone函数,并使用模板专门化(这是我第一次看到的),这样,如果使用特定参数调用clone(),就可以编写代码来处理这种情况 我的问题是:这意味着我必须为我设想的用户可以使用的每种类型的类编写一个clone()版本。这似乎很难!有没有更优雅和/或简单的方法来解决这个问题?像auto_ptr或boost::shared_ptr这样的东西如何能够在没有繁琐的clone()定义的情况下提供此功能 为了完整起见,下面是我的句柄类实现: template <class

书中建议的方法是创建一个全局的
clone
函数,并使用模板专门化(这是我第一次看到的),这样,如果使用特定参数调用
clone()
,就可以编写代码来处理这种情况

我的问题是:这意味着我必须为我设想的用户可以使用的每种类型的类编写一个
clone()
版本。这似乎很难!有没有更优雅和/或简单的方法来解决这个问题?像auto_ptr或boost::shared_ptr这样的东西如何能够在没有繁琐的
clone()
定义的情况下提供此功能

为了完整起见,下面是我的
句柄
类实现:

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; 
};
模板类句柄
{
公众:
句柄():p(0){}
句柄(T*T):p(T){}
句柄(consthandle&s):p(0){if(s.p)p=s.p->clone();}
常量句柄和运算符=(常量句柄和);
~Handle(){delete p;}
运算符bool(){return p;}
T&operator*(){if(p)return*p;else抛出std::runtime_error(“句柄未绑定”);}
T*运算符->(){if(p)返回p;else抛出std::runtime_错误(“句柄未绑定”);}
私人:
T*p;
};

谢谢

这个问题的解决方法就是不为这些类编写
Handle
s。不,真的

auto_ptr
(从C++11起已弃用)从不需要克隆基础对象,因为
auto_ptr
从不复制对象。
auto_ptr
只有对象的一个副本,当复制
auto_ptr
时,对象的控制权被转移——该对象不会被复制

unique\u ptr
永远不需要克隆基础对象,因为只有一个
unique\u ptr
拥有该对象<代码>唯一\u ptr不可复制,只能移动

shared_ptr
永远不需要克隆,因为它也只控制对象的一个副本。复制
共享\u ptr
只会增加引用计数,当引用计数为零时,单个对象将被销毁

通常,如果无法深度复制您的类所控制的资源,那么您应该使该类不可复制。如果客户端需要传递对您的类的引用,则可以将类放置在<代码> AutoPyTPT、 UnQuyPPTR < /C>、或SyddYPPT/<代码>。

使用C克隆(),不是非常类似C++。