Приведение пользовательского объекта shared_ptr

Я использую пользовательский класс shared_ptr для некоторой программы на Arduino, и мне нужно сделать что-то вроде этого:

shared_ptr<Base_class> b_ptr;
shared_ptr<Child_class> ptr((shared_ptr<Child_class>) b_ptr);

В моем классе shared_ptr есть три конструктора:

shared_ptr() : pData(0), reference(0){...}
shared_ptr(T* pValue) : pData(pValue), reference(0){...}
shared_ptr(const shared_ptr<T>& sp) : pData(sp.pData), reference(sp.reference){...}

и кое-что еще... Для кастинга я постарался написать следующее:

    template< typename T2 >
operator T2 * () const
{
   return (T2 *)pData;
}

и:

    template< typename T2 >
operator shared_ptr<T2> () const
{
    shared_ptr<T2> temp((T2 *)pData);
    return temp;
}

но не могу заставить его работать.

, 👍0

Обсуждение

зачем вам вообще нужен общий ptr? изначально не так уж много памяти, чтобы оправдать динамическое выделение для объектов..., @ratchet freak

Лучше не использовать приведение в стиле C в C++. Это работает для типов POD, но по сути это говорит, что этот указатель на elephant теперь является указателем на train. Вам следует узнать о static_cast и dynamic_cast (но я бы пропустил reinterpret_cast, так как это примерно эквивалентно приведению в стиле C), @KIIV


1 ответ


Лучший ответ:

1

Для выполнения:

shared_ptr<Base_class> b_ptr;
shared_ptr<Child_class> ptr(b_ptr);

Вам придется использовать другой конструктор. Если вы посмотрите на этот Пример реализации shared_ptr, вы увидите:

template<class U> shared_ptr(const shared_ptr<U>& s) ...

Это именно тот конструктор, который принимает shared_ptr другого типа.

И аналогично для оператора присваивания.

,

Спасибо за ответ. Но как мне инициализировать приватные данные, такие как: pData(s.pData), reference(s.reference)? Я не могу получить к ним прямой доступ, так как теперь они являются другими членами класса., @Mykolas

Я не знаю многого о вашем классе shared_ptr. В любом случае, вы можете присвоить указатель на потомка в указатель на родителя напрямую (неявным преобразованием)., @KIIV

Я заставил это работать, сделав шаблон другом класса sared_ptr. Спасибо за помощь, @Mykolas

@Mykolas Кстати, если reference - член класса, это никогда не сработает. Вам нужно использовать что-то общее для всех копий., @KIIV

Да, я знаю. Ссылка — это отдельный класс. Каждый объект shared_ptr хранит указатель на этот связанный объект ссылки. Спасибо за комментарий. @KIIV, @Mykolas