我正在实现一个shared_pointer模板,该模板包含一个指向typename T的指针 我想实现一个复制构造函数(带有一个Base类(T)的指针),它接收一个共享指针类(它包含一个指向Derived类(O)的指针)。 如何将接收到的指针从Base类型转换为shared_ptr?
template <typename T>
class Shared_Ptr
{
public:
template <typename O>friend class Shared_Ptr;
template <typename O>
Shared_Ptr(const Shared_Ptr<O>& other_);
private:
struct PtrVal
{
PtrVal(T* ptr);
~PtrVal();
T *m_ptr;
size_t m_count;
};
PtrVal *m_val;
};
如何实现Copy-Constructor ??
template <typename T>
template <typename O>
Shared_Ptr<T>::Shared_Ptr(const Shared_Ptr<O>& other_):
m_val(static_cast<const Shared_Ptr<T> >(other_).m_val)
{}
这会编译但在运行时会出现Segmentation fault(core dumped)。
我找到了另一个解决方案,但它真的很难看: 我将m_ptr of other_转换为T *(而不是O *),然后将m的m_val转换为T的m_val
Shared_Ptr<T>::Shared_Ptr(const Shared_Ptr<O>& other_)
{
if(dynamic_cast<T *>(other_.m_val->m_ptr))
{}
m_val = (Shared_Ptr<T>::PtrVal *)other_.m_val;
}
对更好的建议有什么建议吗? 谢谢
答案 0 :(得分:0)
您希望转换m_ptr
,而不是other_
,因为Shared_Ptr<O>
和Shared_Ptr<T>
没有继承关系。
template <typename T>
template <typename O>
Shared_Ptr<T>::Shared_Ptr(const Shared_Ptr<O>& other_):
m_val (static_cast<T*>(other_.m_val->m_ptr))
{}
您还必须更新计数器。