2013-04-08 3 views
0

멤버에 대한 포인터를 사용하여 복합 클래스 데이터 멤버에 액세스 할 수 있습니까? 다음 코드는 유효하지 않지만 필요성을 보여줍니다. 예를 들어C++ : 복합 클래스 데이터 멤버에 대한 포인터

:

class A 
{ 
public: 
    float fA; 
}; 

class B 
{ 
public: 
    float fB; 
    A a; 
}; 

void test() 
{ 
    // Use of member pointer to access B::fB member 
    float B::*ptr = &B::fB; // -> OK 
    B myB; 
    myB.*ptr = 25.; 

    // Use of member pointer to access B::a.fA member ??? 
    float B::*ptr2 = &B::a.fA; // -> ERROR 
    B myB.*ptr2 = 25.; 
} 

I이 완료했습니다 여기 내 질문 : Pointer to composite class data member - Part 2

+0

왜이 작업을 원하십니까? –

+0

@RogerRowland : 왜 묻는 거니? – 6502

+7

@ 6502 왜냐하면 그것은 매우 드문 질문이기 때문에 문제를 해결하는 완전히 다른 방법이있는 경우가 종종 있습니다. –

답변

0

명백한 "이유"fAB의 구성원이 아니기 때문에 여기에있다. 이 특별한 경우에 구현하면 아마 어떤 특별한 문제도 발생하지 않을 것입니다. 직교성 규칙과 멤버 함수에 대해서는 구현할 수 없을 것 같습니다.

A B::*ptr = &B::a; 
(myB.*ptr).fa = 25.; 

을, 예를 들면 :

당신이 할 수있는 일, 물론, 다음을 통해 fA에 도착, BA 회원의 주소를 가지고있다. (I는 괄호가 필요하다는 것을 확실하지 않다. 그것은 내가 내 머리에 된 우위를 가지고 자주 사용하십시오 constrution 아니다.)

0

은 아마 당신이하는 방법을 요청해야하는, 메모에 동의 당신이,을 원하지 당신이 문제에 관해서는 :

를 원하는 것을 할 것입니다 생각 수행하는 방법 : 아니,이 방법으로 B::a.fA에 액세스 할 수 있습니다.

A myA; 
float A::*ptr2 = &A::fA; // -> OK now 
myB.a.*ptr2 = 25.; 

또는 다음 : 그러나, 다음을 수행 할 수있는 몇 가지 이상한 찾고 구문하지만 내가 제대로 이해한다면, 당신은 클래스 B. 만약을 통해 도레미파 액세스하려고

A B::*ptr3 = &B::a; 
(myB.*ptr3).fA = 1.0f; // -> OK too 
0

그렇다면 클래스 A가 액세스 가능하게되기 전에 클래스 B의 인스턴스를 만들어야합니다. 기본적으로 B가 없으면 내부에있는 것을 액세스 할 수 없습니다. 오류는 ".fA의 왼쪽에는 .class가 있어야합니다/struct/union"이 있어야 컴파일러가 fA의 왼쪽에 무엇이 있는지 파악할 수 없으므로 "a"가 정의되지 않았거나 존재하지 않습니다 . 또한 B myB와 함께 재정의 오류가 발생했습니다.

0

아니요 C++ 구문이 허용하지 않기 때문에 불가능합니다. 나는 당신이하려는 일에 정말로 특별한 것을 보지 못했지만 단순히 언어로는 고려하지 않았습니다.

그러나 데이터 멤버에 대한 포인터는 인스턴스를 지정하면 특정 데이터 멤버에 대한 참조를 반환하는 개체입니다. 수동으로 제한 휴식이 기능을 구현할 수 있습니다

struct A 
{ 
    double x; 
    double y; 
    static double& x_of(void *p) { return ((A *)p)->x; } 
    static double& y_of(void *p) { return ((A *)p)->y; } 
}; 

struct B 
{ 
    double z; 
    A a; 
    static double& x_of(void *p) { return ((B *)p)->a.x; } 
    static double& y_of(void *p) { return ((B *)p)->a.y; } 
    static double& z_of(void *p) { return ((B *)p)->z; } 
}; 

포인터의 타입은 단지 double& (*)(void *)입니다 그리고 당신은 회원으로 배열의 요소를 반환하는 경우에도 예를 들어 트릭의이 종류를 사용할 수 있습니다.