Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > boost::shared_ptr и Инициализация


Автор: dix75 26.4.2009, 20:24
Здраствуйте.

Имеется иерархия классов 

Код
class TBase
{
}

class TNULL : public TBase
{
}

class TFirst : public TBase
{
}


Дальше создаю в класс в котором имеется ссылка на преведенную выше иерархию т.е.

Код
class TClient
{
boost::shared_ptr<TBase> Pimpl;
public:
      TClient(int Value);
}


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

Код
TClient::TClient (int Value)
 :Pimpl(Value ? (new TNULL) : (new TFirst) )
{
}
 Но компилятор ругается на то что не может автоматически привести один тип в другой

Остановился на таком варианте
Код
TClient::TClient (int Value)
{
if(Value) boost::shared_ptr<TBase> Pimpl (new TNULL);
     else boost::shared_ptr<TBase> Pimpl (new TFirst);
}

Так зараза оже неправильно работает.
Как быть?

Автор: J0ker 26.4.2009, 21:00
тернарный оператор должен возвращать один и тот-же тип из обоих кейсов (или преобразуемые друг в друга)
попробуй так:
Код

:Pimpl(Value ? reinterpret_cast<TBase*>(new TNULL) : reinterpret_cast<TBase*>(new TFirst) )

и обязательно добавь в TBase виртуальный дестрактор - во избежание так сказать  smile 

Автор: Любитель 26.4.2009, 21:17
J0ker, а зачем ещё реинтерпрет?!

Код

if(Value) boost::shared_ptr<TBase> Pimpl (new TNULL);
     else boost::shared_ptr<TBase> Pimpl (new TFirst);

Я б удивился, если б это работало правильно - вы объявляете две локальных переменных,  а не присваиваете значения полю класса.

И ещё - зачем в С++ использовать int, где (по контексту) bool?

Автор: J0ker 26.4.2009, 21:37
Цитата(Любитель @  26.4.2009,  21:17 Найти цитируемый пост)
J0ker, а зачем ещё реинтерпрет?!

т.к. не существует преобразования из TNULL* в TFirst* или наоборот - этого требует оператор ?:

Автор: dix75 26.4.2009, 23:17
J0ker, 
а зачем интерпрет ?

ведь у них есть общий предок

Автор: Любитель 27.4.2009, 00:24
Цитата(J0ker @  26.4.2009,  21:37 Найти цитируемый пост)
т.к. не существует преобразования из TNULL* в TFirst* или наоборот - этого требует оператор ?: 

Реинтерпрет надо использовать только тогда, когда нужен реинтерпрет smile Если достаточно статика - приличней обойтись им.

Автор: dix75 27.4.2009, 20:55
Любитель, 

Вот и так думаю

Реинтерпрет  вообще не переносим

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)