2016-09-06 16 views
1

Я реализую шаблон shared_pointer, который содержит указатель на имя типа T Я хочу реализовать конструктор-копию (с указателем базового класса (T)), который получает общий класс указателя (который содержит указатель на класс Derived (O)). Как я могу отправить полученный указатель на shared_ptr из базового типа?cast from templated производный класс к базовому классу шаблона

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_ Т * (вместо 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

смотрите в исходном коде для boost :: shared_ptr и std :: shared_ptr. Вы увидите, что дебетер также сохраняется в блоке управления (что важно для стирания стирания). –

+0

Вы должны быть более точными с терминологией, то, что вы называете копией, не является одним. – 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

Не очень хорошая идея, это позволит указателю на базу преобразовать в производную, что не должно произойти. – Slava

+0

@ Слав Я согласен, что это плохая идея, так как нет проверки типа. Я просто отвечаю на заданный вопрос. Может быть, шкопа знает, что он делает, когда называет этот «конструктор броска». – billx

+0

Тогда вы ответили неправильно, потому что без 'static_cast' он мог работать так, как должен. – Slava

 Смежные вопросы

  • Нет связанных вопросов^_^