2016-12-19 17 views
0

클래스 데이터 멤버에 대한 고유 키를 생성해야합니다. 따라서 변수의 주소에서 클래스 개체의 주소를 뺀 값을 구하는 방법을 생각하고 있습니다. 예 :클래스 변수와 클래스 객체의 시작 주소 사이의 주소 차이를 얻는 가장 좋은 방법은 무엇입니까?

struct X { 
    int i; // &i - &X() = 0 (GCC) 
    double d; // &d - &X() = 8 (GCC) 
}; 

이것은 일회성 연습이므로 모든 관심있는 클래스의 코드 실행 초반에 발생합니다. 따라서 일반적으로 클래스의 더미 객체를 선언하고 유형 변환을 통해 주소 차이를 찾습니다. 예 :

X x; 
keyOf_i = long(&x.i) - long(&x); 
keyOf_d = long(&x.d) - long(&x); 

더 좋은 방법이 있습니까?
액세스 지정자 (private)가 문제가되지 않는다고 가정하십시오.

다른 방법으로 클래스 데이터 변수에 대해 고유 한 키를 생성하는 방법이 있다면이 방법을 사용하는 것이 좋습니다.


업데이트 : 매크로 offseof()를 사용하여, 나는 점점 오전 G에서 경고 다음 ++ - 6 : 비 표준 레이아웃 유형 내 offsetof를

는 'MyClass에'정의되지

사실 & 다른 문자열도 MyClass 안에 있습니다. 이 정의되지 않은 것이 고유 한 주소를 제공하더라도 나는 괜찮습니다. 그러나 offsetof() 및 다른 대안에 대한 자세한 정보를 얻고 싶습니다.

+0

@iammilind 나는 차이 답에 대해 생각할 수 없다'offsetof'가 아닌 표준 레이아웃 – Danh

+0

@SamVarshavchik에 대한 정의되지 않은 동작이 DANH 당신이에 더 자세히 설명 할 수있다 "표준 레이아웃 유형". 어떤 상황에서이 차이는 실패 할 수 있습니까? 나는 클래스 객체의 주소와 데이터 멤버의 주소 사이의 차이가 항상 일정하다고 생각했다. 이 차이는 언제 정의되지 않습니까? BTW, 나는 그런 정확한 차이에 관심이 없다. 오히려 저는 클래스의 모든 변수에 대해 고유 한 차이에만 관심이 있습니다. 제발 제안 해주세요. – iammilind

+0

Google for "회원 포인터" 멤버에 대한 포인터는 인스턴스에 대한 포인터가 주어진 경우 구조체 또는 클래스 인스턴스의 일부 멤버에 액세스 할 수있게 해주는 것입니다. – gnasher729

답변

1

offsetof() 매크로 사용 방법은 어떻습니까? 자세한 내용은 http://man7.org/linux/man-pages/man3/offsetof.3.html을 확인하십시오. 매뉴얼 페이지에서 아래

샘플 코드 :

#include <stddef.h> 
#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    struct s { 
     int i; 
     char c; 
     double d; 
     char a[]; 
    }; 

    /* Output is compiler dependent */ 

    printf("offsets: i=%ld; c=%ld; d=%ld a=%ld\n", 
      (long) offsetof(struct s, i), 
      (long) offsetof(struct s, c), 
      (long) offsetof(struct s, d), 
      (long) offsetof(struct s, a)); 
    printf("sizeof(struct s)=%ld\n", (long) sizeof(struct s)); 

    exit(EXIT_SUCCESS); 
}