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

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

18.04.2016, 08:51. Показов 1375. Ответов 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
101 / 94 / 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
101 / 94 / 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Эксперт С++
9150 / 4669 / 1268
Регистрация: 18.10.2014
Сообщений: 10,544
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Эксперт С++
9150 / 4669 / 1268
Регистрация: 18.10.2014
Сообщений: 10,544
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® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.