Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180

Указатель на объект из указателя на член класса

18.04.2016, 08:51. Показов 2331. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Что как-то сей вопрос ставит меня в тупик.

C++
1
2
3
4
5
6
7
8
9
10
class A
{
int i;
} obj;
 
int main()
{
int A::* ptr_to_member = &A::i;
int* ptr_to_int = &obj.i;
};
А теперь, внимание, вопрос. Как из ptr_to_member и ptr_to_int получить указатель на объект obj?
Не будь це указатель на член класса, я бы использовал преобразование ака container_of.... Ну тут оно работать не хочет.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
18.04.2016, 08:51
Ответы с готовыми решениями:

Перевод указателя на член класса в обычный указатель
Добрый день. Есть некоторый API, который принимает обычные указатели на функцию и поэтому при создании приложения на ООП возникает...

Не могу разобраться с синтаксисом указателя на указатель-член структуры
#include <iostream> int i = 100; struct str { int x; int *pi; } index, *p;

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

9
 Аватар для TimeTwo
102 / 95 / 104
Регистрация: 29.11.2009
Сообщений: 407
18.04.2016, 10:39
Mirmik,
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class A
{
int i;
public:
void show();
};
void A::show(){
cout<<i;
}
int main()
{
A *ptr_to_int,obj;
ptr_to_int = &obj;
ptr_to_int->show();
}
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
18.04.2016, 11:16  [ТС]
TimeTwo... Не уверен, что правильно понял, что вы имели ввиду...
ptr_to_int - это как-бы указатель на int, а не на класс.

Но, в любом случае, я глупость написал. container_of вполне применим. С небольшими изменениями переписал его на шаблоны. Стало хорошо ..
0
 Аватар для TimeTwo
102 / 95 / 104
Регистрация: 29.11.2009
Сообщений: 407
18.04.2016, 11:19
Mirmik, указатель должен быть не инт, а "А" в вашем случае + функия которая будет возвращать указатель на i переданного ей obj класса А
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
18.04.2016, 11:38  [ТС]
Нет, нет...

Указатель должен быть именно int. Задача такова: имеется указатель на int. Код по каким-то неочевидным предположениям, нарушающим всяческие соглашения о безопастности считает, что этот самый int является членом класса A, причем известен указатель на член класса, которым, вероятно, этот инт является. Задача получить указатель объекта.

Добавлено через 8 минут
Вот как-то так это выглядит:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename Type, typename MemberType, MemberType Type::*member>
inline uintptr_t member_offset()
{
    constexpr uintptr_t ret = (uintptr_t)&(((Type*)0)->*member);
    return ret;
};
 
template<typename Type, typename MemberType, MemberType Type::*member>
inline Type* member_container(MemberType* ptr)
{
    Type* ret = (Type*)((char*)ptr - member_offset<Type,MemberType,member>());
    return ret;
};
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,222
18.04.2016, 11:48
Цитата Сообщение от Mirmik Посмотреть сообщение
Как из ptr_to_member и ptr_to_int получить указатель на объект obj?
Не будь це указатель на член класса, я бы использовал преобразование ака container_of.... Ну тут оно работать не хочет.
Не совсем понимаю вопроса. Из указателя ptr_to_int получить указатель на obj можно именно методом container_of. Из указателя ptr_to_member получить указатель на obj нельзя никак. Указатель типа "указатель на член" никак не относится к конкретному объекту.
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
18.04.2016, 11:52  [ТС]
TheCalligrapher. Вопрос был в том,
Что для использования container_of необходимо указать имя переменной члена класса.
То есть, как-то так:
C++
1
container_of(ptr_to_int, class_type, NAME_of_int_as_member);
А у меня этого имени таки нет, а вместо него указатель на член класса, под которым скрывается эта переменная.
0
 Аватар для maxm
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
18.04.2016, 11:55
Цитата Сообщение от Mirmik Посмотреть сообщение
C++
1
int A::* ptr_to_member = &A::i;
Как оно должно работать, если нету такого члена класса. Но если я правильно понял вопрос, то вот вариант:
0
techpriest
 Аватар для Mirmik
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
18.04.2016, 12:12  [ТС]
maxm
Эх... Не умею я объяснять.

Есть указатель на переменную, как на отдельный объект.
И указатель на переменную - член класса (ну, то бишь, реально - смещение от начала класса).

Нужно было получить указатель на объект класса, содержащего эту переменную, исходя из этой информации.

Проблема в том, что с++ очень не любит операций над указателями на члены класса. Ну, вроде я это решил (смотри выше)

Добавлено через 2 минуты
Ну, по факту, в макросе container_of в одном месте могла бы звёздочка добавится и все бы зафурычило.

Добавлено через 7 минут
Таки так грамотнее :

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
template<typename Type, typename MemberType, MemberType Type::*member>
struct member_helper
{
    constexpr static uintptr_t offset = (uintptr_t)&(((Type*)0)->*member);
};
 
 
template<typename Type, typename MemberType, MemberType Type::*member>
inline Type* member_container(MemberType* ptr)
{
    Type* ret = (Type*)((char*)ptr - member_helper<Type,MemberType,member>::offset);
    return ret;
};
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12937 / 6804 / 1821
Регистрация: 18.10.2014
Сообщений: 17,222
18.04.2016, 19:41
Цитата Сообщение от maxm Посмотреть сообщение
Как оно должно работать, если нету такого члена класса
"Если нету", то и работать не должно. Но в данном случае есть.

Добавлено через 2 минуты
Цитата Сообщение от Mirmik Посмотреть сообщение
Что для использования container_of необходимо указать имя переменной члена класса.
А, понятно. Вы все правильно сделали с самого начала. Т.е. в "классическом" container_of имя поля класса используется лишь для (uintptr_t)&(((Type*)0)->member), а в вашем случае будет (uintptr_t)&(((Type*)0)->*member) и все.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
18.04.2016, 19:41
Помогаю со студенческими работами здесь

Передача указателя на функцию-член класса
Необходимо передать фунцию-член класса как аргумент в функцию другого класса. Код: Файл main.cpp #include &quot;head.hpp&quot; ...

Как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса?
Подскажите, пожалуйста, как связать сигнал одного класса со слотом другого класса, содержащего указатель на объект этого класса. Буду очень...

Хранение в map указателя на функцию-член шаблонного класса
Здравствуйте! Сделал я себе вызов написать джунгли из ООП деревьев, типо, объекты обмениваются между собой сообщениями используя их...

Указатель на ф-цию член класса
Чёрная магия или я бот? g++ sub.cpp:21: error: expected unqualified-id before ‘*’ token sub.cpp:21: error: must use ‘.*’ or...

Указатель на член структуры/класса
Всем привет! Помогите разобраться. Пусть есть такой код: template &lt;typename Type&gt; class DynamicQueue { private: class Node { ...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru