techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
1

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

18.04.2016, 08:51. Показов 1764. Ответов 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
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.04.2016, 08:51
Ответы с готовыми решениями:

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

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

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

Передача указателя на функцию-член класса
Необходимо передать фунцию-член класса как аргумент в функцию другого класса. Код: Файл...

9
102 / 95 / 104
Регистрация: 29.11.2009
Сообщений: 407
18.04.2016, 10:39 2
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
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
18.04.2016, 11:16  [ТС] 3
TimeTwo... Не уверен, что правильно понял, что вы имели ввиду...
ptr_to_int - это как-бы указатель на int, а не на класс.

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

Указатель должен быть именно 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Эксперт С++
10314 / 5604 / 1530
Регистрация: 18.10.2014
Сообщений: 13,690
18.04.2016, 11:48 6
Цитата Сообщение от Mirmik Посмотреть сообщение
Как из ptr_to_member и ptr_to_int получить указатель на объект obj?
Не будь це указатель на член класса, я бы использовал преобразование ака container_of.... Ну тут оно работать не хочет.
Не совсем понимаю вопроса. Из указателя ptr_to_int получить указатель на obj можно именно методом container_of. Из указателя ptr_to_member получить указатель на obj нельзя никак. Указатель типа "указатель на член" никак не относится к конкретному объекту.
0
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
18.04.2016, 11:52  [ТС] 7
TheCalligrapher. Вопрос был в том,
Что для использования container_of необходимо указать имя переменной члена класса.
То есть, как-то так:
C++
1
container_of(ptr_to_int, class_type, NAME_of_int_as_member);
А у меня этого имени таки нет, а вместо него указатель на член класса, под которым скрывается эта переменная.
0
63 / 35 / 25
Регистрация: 17.07.2014
Сообщений: 457
18.04.2016, 11:55 8
Цитата Сообщение от Mirmik Посмотреть сообщение
C++
1
int A::* ptr_to_member = &A::i;
Как оно должно работать, если нету такого члена класса. Но если я правильно понял вопрос, то вот вариант:
0
techpriest
634 / 213 / 57
Регистрация: 27.02.2014
Сообщений: 1,180
18.04.2016, 12:12  [ТС] 9
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Эксперт С++
10314 / 5604 / 1530
Регистрация: 18.10.2014
Сообщений: 13,690
18.04.2016, 19:41 10
Цитата Сообщение от maxm Посмотреть сообщение
Как оно должно работать, если нету такого члена класса
"Если нету", то и работать не должно. Но в данном случае есть.

Добавлено через 2 минуты
Цитата Сообщение от Mirmik Посмотреть сообщение
Что для использования container_of необходимо указать имя переменной члена класса.
А, понятно. Вы все правильно сделали с самого начала. Т.е. в "классическом" container_of имя поля класса используется лишь для (uintptr_t)&(((Type*)0)->member), а в вашем случае будет (uintptr_t)&(((Type*)0)->*member) и все.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.04.2016, 19:41
Помогаю со студенческими работами здесь

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

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

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

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

Указатель на функцию-член класса
Нужно передать указатель на функцию класса A изнутри самого класса А в функцию, в качестве...

Указатель на функцию - член класса.
делаю так: class c1 { void foo(); } class c2 { void (*fp)();


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru