2012-07-05 2 views
2

я иногда вижу биты кода, подобные этим:Адрес члена класса без экземпляра класса?

class A { 
    int b; 
} 

void foo() { 
    int* blah = &A::b; 
    // Other stuff. 
} 

Но как бы захватывая адрес переменной-члена класса без экземпляра класса быть полезным? Что оно делает?

+0

Вы уверены, что 'b' не является статическим членом' A'? – reuben

+0

Я уверен. Я видел фрагменты кода, где он, казалось, полагался, что он не является статическим членом. – OniLink

+0

В этом случае вы уверены, что тип 'blah' является' int * '? –

ответ

8

Ваш код плохо сформирован и не компилируется. Тип blah не int*, это int (A::*). То есть, это не «указатель на int», это «указатель на элемент данных типа класса A, тип которого int».

Обратите внимание, что для получения указателя на элемент член должен быть доступен. Чтобы вычислить &A::b в foo(), b должен быть публичным пользователем данных, или foo() должен быть другом A.

Указатель на объект не указывает на объект. Скорее, указатель на элемент может быть привязан к объекту, чтобы получить значение его члена данных. Вы можете получить значение элемента данных b объекта A путем привязки указателя-к-элементу blah к экземпляру A. Например,

A x; 
int b_value = x.*blah; // b_value has the value of x.b 
+0

Это ... имеет большой смысл. Спасибо! – OniLink

1

Класс A имеет Int b. Это означает, что b - это данные класса A, вы можете получить указатель на b, если у вас есть экземпляр A.

Я думаю, что вы хотите спросить для этого случая:

class A{ 
    int foo(int i) { 
    } 
} 

после компиляции, метод Foo имеет адрес, вы можете получить указатель на &A::foo.

Смежные вопросы