Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 09.04.2015
Сообщений: 22
1

Приведение типа указателя

19.05.2015, 14:29. Показов 1034. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте, у меня такой вопрос: как организовать приведение типа указателя к другому? Есть указатель
C++
1
string *ptr;
на поле класса, нужно вывести на печать другие поля. Я инкрементирую указатель, потом привожу к нужному мне типу как
C++
1
2
ptr++; 
int ptr1 = reinterpret_cast<int>(ptr);
, при условии,что в классе поля располагаются в таком же порядке. Ошибки нет, но в новом указателе не те значения получаются, просто какие-то очень большие цифры. А если не делать приведение типа (следующее поле было бы тоже string), то получалось бы верно,из чего делаю вывод, что проблема в приведении типа. Как можно исправить эту проблему?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
19.05.2015, 14:29
Ответы с готовыми решениями:

Приведение указателя базового типа
У меня не получается выполнить приведение указателя базового типа. Я, и static_cast пробовал, и...

Приведение типа указателя на метод
Здравствуйте. Есть функция, принимающая void (*f)(), возможно ли использовать ее в классе,...

Приведение указателя на функцию
Здравствуйте, у меня простейший вопрос, но самому не догнать что-то... В качестве аргумента...

Приведение void* указателя к типу
struct tParamStruct { const char* Result; }; tParamStruct ParamStruct; void show(void...

9
44 / 44 / 19
Регистрация: 04.05.2014
Сообщений: 190
19.05.2015, 14:33 2
Так очень не рекомендуют делать. Поля класса могут располагаться в памяти по-разному в зависимости от настроек компилятора. Следует передавать везде указатель на сам класс и из него получать любые данные.
0
Модератор
Эксперт С++
13526 / 10772 / 6420
Регистрация: 18.12.2011
Сообщений: 28,760
19.05.2015, 14:36 3
Такая практика порочна.
Она дает неопределенное поведение программы.
Работайте с указателями только в пределах выделенной под переменную памяти.
В контейнерах STL именно для этого и созданы обобщенные указатели - итераторы.
Т.е. в пределах string можете передвигаться так:
C++
1
2
for(string::iterator p=ptr->begin();p!=ptr->end();++p)
    cout<<*p;
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
19.05.2015, 14:44 4
Цитата Сообщение от 1-09Mix Посмотреть сообщение
Я инкрементирую указатель
Это не правильный подход. Надо создать итератор для вашего класса и его уже инкрементировать сколько захочется.
0
Заблокирован
19.05.2015, 14:52 5
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Надо создать итератор для вашего класса
В классе обычно данные разнородные, как по типу, так и по размеру Ересь в общем
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
19.05.2015, 14:59 6
Ну и итератор будет там себя прекрасно чувствовать.
0
15 / 15 / 8
Регистрация: 17.06.2013
Сообщений: 209
19.05.2015, 15:01 7
SatanaXIII, а можно пример?
0
Заблокирован
19.05.2015, 15:02 8
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Ну и итератор будет там себя прекрасно чувствовать.
Каким образом?

C++
1
2
3
4
5
6
7
class A
{
   int a;
   long long b;
   short c;
   char d;
}
Хмм, ну и как там себя будет чувствовать итератор?
0
Почетный модератор
Эксперт С++
5850 / 2861 / 392
Регистрация: 01.11.2011
Сообщений: 6,907
19.05.2015, 15:15 9
Вот хороший пример: Собственный класс-итератор
Немножко теории: http://habrahabr.ru/post/84184/
Мощно: Вектор наподобие STL
0
0 / 0 / 0
Регистрация: 09.04.2015
Сообщений: 22
19.05.2015, 15:22  [ТС] 10
Цитата Сообщение от SatanaXIII Посмотреть сообщение
Вот хороший пример: Собственный класс-итератор
Немножко теории: http://habrahabr.ru/post/84184/
Мощно: Вектор наподобие STL
Спасибо!Пытаюсь теперь написать итератор, не подскажете, как реализовать begin() и end()? Запутался немного, глядя на этот пример. Они могут относиться к разным типам? То есть, если первое поле класса,допустим , string, а последее int?
0
19.05.2015, 15:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.05.2015, 15:22
Помогаю со студенческими работами здесь

Приведение void* к типу указателя на структуру
Тема обсуждалась здесь, но решения так и нет нормального Есть два (и более, хоть до 20) линейных...

Приведение указателя на void к другому типу?
в поиске смотрел - не помогло! Возникла проблемка: В книге сказано, что указателю на void можно...

Приведение void указателя к определенному типу с сохранением результата
Есть функция funс(void *pointer, char type) { ... } Нужно чтобы в данной функции этот...

Конструкторы, приведение типа и ошибка "Не найден оператор, принимающий правый операнд типа 'char *'"
#include &lt;stdio.h&gt; class A { int somemember; public: A(){printf(&quot;A()\n&quot;);} ...

приведение типа
Здравствуйте. у меня такой вопрос. как можно в c++ 2008 поменять тип. мне нужно char перевести в...

C-style приведение типа: (T) x
Есть современные формы приведения типа: static_cast&lt;T&gt;(x) dynamic_cast&lt;T&gt;(x)...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru