LINUX.ORG.RU

boost::shared_ptr и downcast


0

0

boost::shared_ptr<Base> base(new Derived); boost::shared_ptr<Derived> derived(base.get()); // invalid conversion from `Base*' to `Derived*

Как наиболее грамотно произвести downcast с "умными указателями" ?

anonymous
Ответ на: комментарий от anonymous

class Base {
public :
    virtual ~Base() {}
};

class Derived : public Base {
};

void
foo()
{
    boost::shared_ptr<Base> base(new Derived);
    boost::shared_ptr<Derived> derived(static_cast<Derived *>(base.get()));
}

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

Внимательно прочитай мой вопрос . Мне нужен функционирующий "downcast" , а не как скомпилировать без ошибок .

anonymous
()
Ответ на: комментарий от anonymous

> Внимательно прочитай мой вопрос . Мне нужен функционирующий "downcast" , а не как скомпилировать без ошибок .

а как вы себе представляете это в контексте shared_ptr? в принципе.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от anonymous

> Придется одказываться от умных и пользоваться обычными указателями ...

а что это даст? если семантика вида:

Base *base = new Base;
Derived *derived = static_cast<Derived>(base);
....
delete base;
delete derived;

...то от корки это всё равно не спасёт.

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от klalafuda

немного по другому
Base* b=new Derived;
и в определенном месте необходимо привести к Derived .
static_cast вполне работает с нормальными указателями , но не с умными.

anonymous
()
Ответ на: комментарий от anonymous

> Base* b=new Derived;
и в определенном месте необходимо привести к Derived .
static_cast вполне работает с нормальными указателями , но не с умными.

ну тогда видимо не стоит *заворачивать* результат приведения в shared_ptr и будет относительное счастье.

boost::shared_ptr<Base> base(new Base);
Derived *derived = statis_cast<Derived *>(base.get());
derived->foo();
.....

// wbr

klalafuda ★☆☆
()
Ответ на: комментарий от anonymous

> Внимательно прочитай мой вопрос . Мне нужен функционирующий "downcast" , а не как скомпилировать без ошибок .

Downcast - это от derived к base, а не наоборот. Наоборот называется upcast.

mv ★★★★★
()
Ответ на: комментарий от mv

> Downcast - это от derived к base, а не наоборот. Наоборот называется upcast.

есть сомнение

dilmah ★★★★★
()
Ответ на: комментарий от mv

>Downcast - это от derived к base, а не наоборот. Наоборот называется upcast.

не-а

V_L_A_D ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.