Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> boost::shared_ptr и Инициализация 
:(
    Опции темы
dix75
Дата 26.4.2009, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: нет
Всего: 1



Здраствуйте.

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

Код
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);
}

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


--------------------
save your mind
PM MAIL   Вверх
J0ker
Дата 26.4.2009, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



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

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

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

Это сообщение отредактировал(а) J0ker - 26.4.2009, 21:03


--------------------
user posted image
PM MAIL   Вверх
Любитель
Дата 26.4.2009, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



J0ker, а зачем ещё реинтерпрет?!

Код

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

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

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


--------------------
PM MAIL ICQ Skype   Вверх
J0ker
Дата 26.4.2009, 21:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 986
Регистрация: 17.9.2008

Репутация: 4
Всего: 14



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

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


--------------------
user posted image
PM MAIL   Вверх
dix75
Дата 26.4.2009, 23:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: нет
Всего: 1



J0ker, 
а зачем интерпрет ?

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


--------------------
save your mind
PM MAIL   Вверх
Любитель
Дата 27.4.2009, 00:24 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Программист-романтик
****


Профиль
Группа: Комодератор
Сообщений: 3645
Регистрация: 21.5.2005
Где: Воронеж

Репутация: 24
Всего: 92



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

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


--------------------
PM MAIL ICQ Skype   Вверх
dix75
Дата 27.4.2009, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 462
Регистрация: 17.7.2007

Репутация: нет
Всего: 1



Любитель, 

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

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


--------------------
save your mind
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0462 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.