Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Olex
18 / 18 / 1
Регистрация: 27.05.2013
Сообщений: 115
#1

Как сделать *_cast указателя shared_ptr<T>? - C++

24.11.2015, 16:13. Просмотров 305. Ответов 3
Метки нет (Все метки)

Хочу определять тип (например через dynamic_cast) указателя shared_ptr.
(криво звучит но по другому выразить не могу)

Есть несколько классов. Все примерно такой структуры (смотри ниже).
Наследуются они чтоб сделать этот самый dynamic_cast

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class foo_type{
  virtual void foo_(void)=0;
};
class char_int : public foo_type{
  public:
  char_int(int size):size_(size){
          first= new char [size]; second = new int [size];
  }
  ~char_int(){
         delete first; delete second;
  };
  int size_;
  char  *first;
  int *second;
};
 
class float_double : public foo_type{
  public:
  float_double(int size):size_(size){
          first= new float [size]; second = new double [size];
  }
  ~float_double(){
         delete first; delete second;
  };
  int size_;
  float  *first;
  double *second;
};
теперь я хочу иметь некоторый указатель shared_ptr<T> (boost или std тут без разници)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
template<class T>
class TypeTMI_Ttype {
    public:
 
     ~TypeTMI_Ttype(){};
     TypeTMI_Ttype(int size):size_(size){
         data = boost::shared_ptr<T>(new T[size_]);
     };
 
     T* get_data(void){return  data.get();}
 
     int size_;
     boost::shared_ptr<T>data;
};
И вот теперь я хочу написать что то вроде:
C++
1
2
3
4
boost::shared_ptr<foo_type>pdata;//например это глобальный указатель
 
//где то создаем нужный тип
pdata = boost::shared_ptr < TypeTMI_Ttype <float_double> >(new float_double(100));
потом куда то передать pdata, и там определить на что оно указывает, char_int или float_double.
Последний отрывок кода конечно компилятор не воспринимает.

Как осуществить подобный старомодный фокус в предложенной интерпретации?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.11.2015, 16:13
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как сделать *_cast указателя shared_ptr<T>? (C++):

Презентация собственной реализации Разделяемого Указателя (shared_ptr) - C++
Пришлось самому реализовывать эквивалентный shared_ptr класс, так как на винде стала повреждена библиотека языка C. Времени на...

Как сделать функцию от указателя на класс и указателя на метод? - C++
Не получается сделать функцию, параметрами которой являются указатель на класс и на метод. Обращаться к классу нужно именно по указателю,...

*_cast< тип >( выражение ) - C++
В чём отличие static_cast, dynamic_cast, reinterpret_cast, const_cast от преобразования типа в скобках (стиль Си вроде) float f = 10.9; ...

Как воспользоваться shared_ptr? - C++
Мне нужно вернуть shared_ptr из сией ф-ции Tovar* createTovar(string s,string s1) { return new Office(s,s1); } Как это...

Почему увеличение указателя на sizeof(тип) не тождественно инкременту этого же указателя? - C++
Всем доброго дня.:) Можете обьяснить ,почему при инкриментировании указателя,его значение(адресс) увеличивается на 4 (размер int в...

Преобразование кода без указателя в код с использованием указателя - C++
Правильно ли выполнил? Исходный код без указателя #include &lt;iostream&gt; #include &lt;cstdlib&gt; #include &lt;fstream&gt; using namespace...

3
Tulosba
:)
Эксперт С++
4397 / 3233 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.11.2015, 16:19 #2
std::dynamic_pointer_cast ?
1
Olex
18 / 18 / 1
Регистрация: 27.05.2013
Сообщений: 115
25.11.2015, 13:53  [ТС] #3
Tulosba,
можете ответить,
вот по шагово,
я могу написать так:
C++
1
2
boost::shared_ptr< TypeTMI_Ttype <char> > pdata;
pdata = boost::shared_ptr< TypeTMI_Ttype <char> > (new TypeTMI_Ttype<char>(1000));
а так не могу:
C++
1
2
boost::shared_ptr< TypeTMI_Ttype <foo_type> > pdata;
pdata = boost::shared_ptr< TypeTMI_Ttype <float_double> > (new TypeTMI_Ttype<float_double>(1000));
E2248 Cannot find default constructor to initialize array element of type 'float_double'
E2034 Cannot convert 'TypeTMI_Ttype<float_double> * const' to 'TypeTMI_Ttype<foo_type> *'

можете показать, как мне обьявлять указатель и как его инициализировать чтоб потом определить какой класс влетел в TypeTMI_Ttype, float_double , или char_int ?
0
Operok
163 / 161 / 44
Регистрация: 15.02.2015
Сообщений: 472
Завершенные тесты: 2
25.11.2015, 15:11 #4
Дело в том что шаблонные классы с разным шаблонным параметром это по сути разные классы, друг о друге ничего не знающие, даже для доступа к приватным данным их нужно "друзьями" объявлять. Чтобы динамически определять класс (тип) указателя, нужно наследование и RTTI, и использовать dynamic_cast или, если для shared_ptr, std::dynamic_pointer_cast, как подсказали выше. Если вы в shared_ptr храните указатель на объект только вам известного типа вместе с "делитером", то для приведения к соответствующему виду можно использовать std::static_pointer_cast.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct SomeData
{
...
}
struct MainData : SomeData
{
...
}
struct OtherData : SomeData
{
...
}
 
std::shared_ptr<SomeData> dataPtr[2];
...
dataPtr[0].reset(new MainData(), std::default_delete<MainData>());
dataPtr[1].reset(new OtherData(), std::default_delete<OtheData>());
...
MainData* mData = std::static_pointer_cast<SomeData, MainData>(dataPtr[0])->get();
OtherData* oData = std::static_pointer_cast<SomeData, OtherData>(dataPtr[1])->get();
1
25.11.2015, 15:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.11.2015, 15:11
Привет! Вот еще темы с ответами:

В чём отличие константного указателя и указателя на константу? - C++
int *const p1 и int const* p2 Объясните мне в чём тут отличие.

Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... - C++
Написать обработчик исключений ситуации при преобразовании указателя на класс B до указателя на абстрактный класс А ... как сделать...

Shared_ptr - C++
Всем хай. Есть некий класс и в нём такой метод: class Base { public: std::shared_ptr&lt;Base&gt; get_ptr() { ...

shared_ptr валится - C++
#include &lt;iostream&gt; #include &lt;string&gt; using namespace std; #include &quot;boost/shared_ptr.hpp&quot; class One { public: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.