Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Смещение члена класса


Автор: Rifeys 25.7.2007, 12:06
Добрый день!

Возникла необходимость иметь список членов класса (их смещении от указателя на этот класс)

Код

class A {
int p;

static int offset;
}

int A::offset = Смещение A::p от начала класса


Т.е. если сделать

Код

A *o;
(int*)((void*)o)+A::offset), то получим указатель на член класса


Как это правильно реализовать?

В голову приходит только создать экземпляр класса A, получить указатель на него и на его член p, преобразовать их в int и их вычесть. 
Код

A o;
int A::offset = (int)&o - (int)&(o.p)


Есть ли способ без создания экземпляра класса?

Автор: Ln78 25.7.2007, 13:22
Rifeys, возможно есть способ красивее, первое, что пришло в голову:
Код

int offset = (int)&(((A*)0)->p);

Автор: Ln78 25.7.2007, 13:54
Кстати, в VS определён похожий макрос:
Код

/* Define offsetof macro */
#ifdef __cplusplus

#ifdef  _WIN64
#define offsetof(s,m)   (size_t)( (ptrdiff_t)&reinterpret_cast<const volatile char&>((((s *)0)->m)) )
#else
#define offsetof(s,m)   (size_t)&reinterpret_cast<const volatile char&>((((s *)0)->m))
#endif

#else

#ifdef  _WIN64
#define offsetof(s,m)   (size_t)( (ptrdiff_t)&(((s *)0)->m) )
#else
#define offsetof(s,m)   (size_t)&(((s *)0)->m)
#endif
#endif    /* __cplusplus */

совместим с ANSI, лучше пользоваться готовым

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)