2012-03-16 4 views
7

씨 케니 커의 this column, 그는이 같은 구조체 및 타입 정의 정의 :이 typedef의 의미는 무엇입니까? 에서

struct boolean_struct { int member; }; 
typedef int boolean_struct::* boolean_type; 

그런 다음이 형식 정의의 의미가 무엇인가는?

operator boolean_type() const throw() 
{ 
    return Traits::invalid() != m_value ? &boolean_struct::member : nullptr; 
} 

"& boolean_struct :: 회원"의 의미는 무엇입니까 :

또 다른 문제는 다음 코드와 직결된다?

struct boolean_struct { int member; };  
typedef int boolean_struct::* boolean_type;  

그런 다음이 형식 정의의 의미는 무엇인가 : 미스터 케니 커의이 칼럼에서

답변

13

, 그는 구조체와 이런 타입 정의를 정의?

typedef

boolean_struct 개체 내부 int 부재의 포인터에 해당 boolean_type라는 타입을 생성한다.

이 아니며, int에 대한 포인터와 같습니다. 차이점은 boolean_type의 오브젝트는 참조 해제하기 위해 boolean_struct 오브젝트가 필요하다는 것입니다. int에 대한 일반적인 포인터는 그렇지 않습니다. 이것이 어떻게 다른지 확인하는 가장 좋은 방법은 몇 가지 코드 예제를 사용하는 것입니다.

int의 만 일반 포인터를 생각해 보면 알 수 있듯이

struct boolean_struct { int member; }; 
typedef int boolean_struct::* boolean_type; 

int main() 
{ 

    // Two boolean_struct objects called bs1 and bs2 respectively: 
    boolean_struct bs1; 
    boolean_struct bs2; 
    // Initialize each to have a unique value for member: 
    bs1.member = 7; 
    bs2.member = 14; 

    // Obtaining a pointer to an int member inside a boolean_struct 
    boolean_type pibs = &boolean_struct::member; 

    // Note that in order to dereference it I need a boolean_struct object (bs1): 
    int value3 = bs1.*pibs; 
    // value3 now has value 7. 

    // I can use the same pibs variable to get the value of member from a 
    // different boolean_struct (bs2): 
    int value4 = bs2.*pibs; 
    // value4 now has value 14. 

    return 0; 
} 

, 구문과 행동은 우리가 boolean_struct 내부 int 멤버에 대한 포인터를 사용하는 경우

이제
struct boolean_struct { int member; }; 

int main() 
{ 
    // Two boolean_struct objects called bs1 and bs2 respectively: 
    boolean_struct bs1; 
    boolean_struct bs2; 
    // Initialize each to have a unique value for member: 
    bs1.member = 7; 
    bs2.member = 14; 

    // Obtaining a pointer to an int, which happens to be inside a boolean_struct: 
    int* pi1 = &(bs1.member); 
    // I can dereference it simply like this: 
    int value1 = *pi1; 
    // value1 now has value 7. 

    // Obtaining another pointer to an int, which happens to be inside 
    // another boolean_struct: 
    int* pi2 = &(bs2.member); 
    // Again, I can dereference it simply like this: 
    int value2 = *pi2; 
    // value2 now has value 14. 

    return 0; 
} 

고려 다른.

operator boolean_type() const throw() 
{  
    return Traits::invalid() != m_value ? &boolean_struct::member : nullptr; 
} 

"& boolean_struct :: 회원"의 의미는 무엇입니까 :

또 다른 문제는 다음 코드와 직결된다?

boolean_struct 안에 member 변수의 주소를 반환합니다. 위 코드 예제를 참조하십시오.

+0

답변 해 주셔서 감사합니다. 하지만 boolean_struct 객체가 없으므로 & boolean_struct :: member는 정확히 무엇을 가리 킵니까? – Rong

+1

@Rong : 그것이 가리키는 것은 컴파일러의 구현 세부 사항입니다. 일반적으로 클래스 멤버에 오프셋 된 어떤 종류의 정수로 구현됩니다. 그러나 정확한 수치는 상관 없습니다. 특정 유형의 객체의 특정 부분을 고려하지 않고 특정 유형의 객체의 특정 부분에 액세스 할 수있게하는 것이 중요합니다. 그것은 마치 인체의 다리를 가리키는 것과 같습니다. 나는 개인에 관계없이 그것을 할 수있다. 이것이 바로'boolean_struct :: member' 표현식이 작동하는 이유입니다. 특정 인스턴스에 관계없이'boolean_struct' 안의'member'를 가리킬 수 있습니다. –