铸造

2016-09-06 119 views
1

我实现保存一个指针类型名Ť 我想实现一个拷贝构造(与碱类(T)的一个指针)一个shared_pointer模板,其接收共享指针类(包含指向派生类(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) 
{} 

这编译但在运行时给出分段错误(核心转储)。

我找到了另一种解决方案,但它实在是太丑: 我转换m_ptr的other_到T *(代替邻*),然后施放的O m_val到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

在升压:: shared_ptr的和std :: shared_ptr的源代码看看。您会看到删除程序也存储在控制块中(这对于删除类型很重要)。 –

+0

你应该用术语更准确,你所说的copy ctor不是一个。 – Slava

回答

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)) 
{} 

您还需要更新计数器。

+0

不是一个好主意,这将允许指向base的指针转换为派生的,这不应该发生。 – Slava

+0

@Slava我同意这是一个坏主意,因为没有类型检查。我只是回答所问的问题。也许什科帕知道他在称这个“施放构造函数”时做了什么。 – billx

+0

然后你回答不正确,因为没有'static_cast'它可以按照它应该的方式工作。 – Slava