«Правильный» способ сделать это - использовать макрос offsetof()
из <stddef.h>
. К сожалению, offsetof()
имеет некоторые драконовские ограничения в C ++:
Из-за расширенной функциональности структур в C ++ в этом языке использование offsetof
ограничено «типами POD [обычные старые данные]», которые для классов более или менее соответствуют концепции C struct (хотя непроизводные классы только с открытыми не виртуальными функциями-членами и без конструктора и / или деструктора также будут квалифицироваться как POD).
Так что если вы сделаете a
и b
публичными и избавитесь от конструктора TestMem
, вы можете написать что-то вроде этого для доступа к a
:
C ++ стиль:
#include <cstddef>
int vala = *reinterpret_cast<int *>(reinterpret_cast<char *>(&o1)
+ offsetof(TestMem, a));
C стиль:
#include <stddef.h>
int vala = *(int *) ((char *) &o1 + offsetof(TestMem, a));
Обратите внимание, что вам нужно использовать &o1
здесь, а не p
, который является указателем на функцию. Адрес TestMem::TestMem1
не будет иметь никакого отношения к местоположениям a
и b
. Методы класса не находятся в памяти рядом с переменными-членами класса.
«Неправильный» способ - просто угадать, где a
и b
находятся в памяти. Скорее всего, они имеют смещения 0 и 4 от начала o1
соответственно. Так что этот код будет работать большую часть времени:
int vala = *(int *) ((char *) &o1 + 0);
int valb = *(int *) ((char *) &o1 + 4);
Здесь много предположений. Это предполагает, что целые числа составляют 4 байта и что между a
и b
нет заполнения. С другой стороны, он не имеет никаких ограничений сверху: a
и b
не должны быть публичными, вы можете иметь конструктор, что угодно.