Приведение пользовательского объекта 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;
}
но не могу заставить его работать.
@Mykolas, 👍0
Обсуждение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
- Как получить тип данных переменной?
- Преобразование в Unix Timestamp и обратно
- Невозможно создать массив типа const char*
- ардуино - миллисекунды ()
- Ошибка Cast from 'char*' to 'uint8_t {aka unsigned char}' loses precision [-fpermissive]
- Получение шестнадцатеричных данных с терминала
- Какой тип данных Arduino допускает десятичные дроби?
- Поскольку double и float представляют один и тот же тип данных (обычно), что предпочтительнее?
зачем вам вообще нужен общий ptr? изначально не так уж много памяти, чтобы оправдать динамическое выделение для объектов..., @ratchet freak
Лучше не использовать приведение в стиле C в C++. Это работает для типов POD, но по сути это говорит, что этот указатель на elephant теперь является указателем на train. Вам следует узнать о static_cast и dynamic_cast (но я бы пропустил reinterpret_cast, так как это примерно эквивалентно приведению в стиле C), @KIIV