2010-07-04 2 views

답변

1

예 가능합니다. 클래스 컨텍스트 내에서 또는 포인터에 friend 액세스 권한이있는 사람이 포인터 (또는 참조)를 반환해야 할 것입니다. 이는 변수 자체가 private이기 때문에 액세스 할 수 없기 때문입니다.

class C 
{ 
public: 
    int* getXPointer() 
    { 
     return &x; 
    } 

    int& getXReference() 
    { 
     return x; 
    } 

private: 
    int x; 
}; 


int main(int argc, char* argv[]) 
{ 
    C c; 
    int* p = c.getXPointer(); 
    int& r = c.getXReference(); 
    assert(p == &r); 
    return 0; 
} 
0

네가 맞다고 이해한다면, 클래스의 개인 멤버에게 포인터를 반환 할 수 있기를 원합니 까?

private: 
     int hidden; 
    public: 
     int& unHide() 
     { 
      return hidden; 
     } 
+0

를? –

+0

내 잘못 했어. – xil3

18

예, 다른 포인터를 만드는 것과 같은 방식입니다. catch는 물론 멤버가 private이기 때문에 안에 포인터 만 생성 할 수 있습니다. 여기서 멤버를 볼 수 있습니다.

class A 
{ 
    public: 
    int* getFooPtr() 
    { 
     return &foo; // OK; Inside the class foo is visible 
    } 

    private: 
    int foo; 
}; 

int main() 
{ 
    A a; 

    int* p_foo1 = &a.foo; // Illegal; Outside the class, foo is private 
    int* p_foo2 = a.getFooPtr(); // OK; getFooPtr() is a public member function 
} 

는 그래서는하지만, 단지 클래스의 멤버 함수 내부, private 멤버에 대한 포인터를 생성하는 것이 가능하고, 멤버 함수에서 해당 생성 된 포인터를 반환 할 수 있습니다. 비공개 멤버에게 포인터를 반환하는 것이 좋은지 아닌지는 또 다른 질문입니다 (일반적으로 좋은 생각은 아닙니다).

+1

"클래스 멤버 함수 내부에서만"... "친구를 제외하고는 대부분 내부 객체도 노출 할 수 있습니다. –

+1

... 정적 구성원은 물론 클래스의 전용 멤버를 가리 키도록 초기화 될 수 있습니다 이것은 어떤 함수 안에도 존재하지 않습니다. – AnT

+0

그는 내 의견으로는 회원 유형에 대한 포인터를 말하고 있습니다. – ThomasMcLeod

2

예, 이전 답변에서 설명한 것처럼 가능합니다. 그러나 타일러 맥 헨리 (Tyler McHenry)는 "좋은 생각입니까?"라고 묻습니다. 아니, 그렇지 않아. 멤버 변수는 좋은 이유 때문에 private로 선언되므로이 방법으로 캡슐화를 파괴하면 문제가 발생할 수 있습니다.

+3

좋은 아이디어인지 여부는 시나리오에 따라 다릅니다. 사람들이 포인터를 std :: vector로 가져올 수 없다면 사람들은 꽤 불만 스러울 것이라고 생각합니다. –

+0

흠. 나는 항상 벡터를 컨테이너로 생각했지만, 당신이 옳습니다. –

+1

개인 멤버에 대한 포인터를 선언한다고해서 반드시 캡슐화가 무효화되는 것은 아닙니다. 어떤 전복이 일어날 수있는 유일한 기회는 포인터가 멤버보다 더 쉽게 접근 할 수있는 경우입니다. OP의 아무 것도 그것이 사실이 아니라고 제안합니다. – AnT

1

질문의 문구는 다소 혼란 스럽습니다. 누군가가 "무언가에"에 대한 포인터를 선언한다고 말하면, 그들은 일반적으로 "int에 대한 포인터 선언"에서와 같이 포인터의 유형 관련 속성에 대해 이야기합니다. 비공개가되는 속성은 구성원의 유형에 전혀 영향을주지 않습니다. 즉, 형식이 int 인 구성원이 공개인지 비공개인지에 관계없이 항상 int 유형의 구성원입니다. 즉, 형식 int *의 포인터는 항상 int 공용 멤버 또는 int 개인 멤버를 가리 키도록 지정할 수 있습니다. 회원이 공개인지 비공개인지는 중요하지 않습니다.

C++에서 일반 포인터 (예 : int *)가 있고 포인터가 "member-to-pointer"유형 (예 : int MyClass::*) 인 경우가 있습니다. "클래스의 데이터 멤버에 대한 포인터"라고 말하면, 포인터의 종류가 일반 포인터인지 멤버 포인터인지는 명확하지 않습니다. 그러나 위의 두 가지 모두에 적용됩니다. 둘 다 쉽게 클래스의 공용, 보호 또는 비공개 멤버를 가리킬 수 있습니다. 사생활은 아무런 차이가 없습니다.

"개인용"속성은 멤버의 유형에 영향을 미치지 않으며 이름으로 직접 참조 될 때 액세스 가능성에만 영향을줍니다. 그래서 포인터를 클래스의 private 데이터 멤버를 가리 키도록하려면 해당 개인 데이터 멤버가 액세스 할 수있는 영역에서 포인터를 초기화 (또는 할당)해야합니다. 소유 클래스 또는 내부 메소드 친구 기능.

+1

대답, 그것은 의견입니다. – ThomasMcLeod

+0

댓글이 아닙니다. 가능한 모든 해석에 대한 완전한 설명입니다. –

3

C++에서 명시 적 인스턴스화에서 개인 멤버의 주소를 전달할 수 있다는 사실을 악용하는 경우 선언 클래스 외부에서 비 정적 개인 멤버에 액세스 할 수 있습니다. 그러나이 기술로 멤버에 대한 포인터를 사용해야하기 때문에 정적 전용 멤버에 액세스 할 수 없습니다.

struct A 
{ 
    A() : x("proof!") {} 
private: 
    char const* x; 
}; 

template class stow_private<A_x,&A::x>; 

int main() 
{ 
     A a; 

     // Use the stowed private member pointer 
     std::cout << a.*stowed<A_x>::value << std::endl; 
}; 

현재 stowed<> 및 세부 사항의 이행을 찾을 수 있습니다 http://bloglitb.blogspot.hu/2010/07/access-to-private-members-thats-easy.html 당신은`mutable`을 지정한 이유는 https://gist.github.com/dabrahams/1528856

관련 문제