클래스의 개인 데이터 멤버에 대한 포인터를 선언 할 수 있습니까? 그렇다면 어떻게해야할까요?클래스의 개인 데이터 멤버에 대한 포인터
답변
예 가능합니다. 클래스 컨텍스트 내에서 또는 포인터에 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;
}
네가 맞다고 이해한다면, 클래스의 개인 멤버에게 포인터를 반환 할 수 있기를 원합니 까?
private:
int hidden;
public:
int& unHide()
{
return hidden;
}
예, 다른 포인터를 만드는 것과 같은 방식입니다. 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 멤버에 대한 포인터를 생성하는 것이 가능하고, 멤버 함수에서 해당 생성 된 포인터를 반환 할 수 있습니다. 비공개 멤버에게 포인터를 반환하는 것이 좋은지 아닌지는 또 다른 질문입니다 (일반적으로 좋은 생각은 아닙니다).
"클래스 멤버 함수 내부에서만"... "친구를 제외하고는 대부분 내부 객체도 노출 할 수 있습니다. –
... 정적 구성원은 물론 클래스의 전용 멤버를 가리 키도록 초기화 될 수 있습니다 이것은 어떤 함수 안에도 존재하지 않습니다. – AnT
그는 내 의견으로는 회원 유형에 대한 포인터를 말하고 있습니다. – ThomasMcLeod
예, 이전 답변에서 설명한 것처럼 가능합니다. 그러나 타일러 맥 헨리 (Tyler McHenry)는 "좋은 생각입니까?"라고 묻습니다. 아니, 그렇지 않아. 멤버 변수는 좋은 이유 때문에 private로 선언되므로이 방법으로 캡슐화를 파괴하면 문제가 발생할 수 있습니다.
좋은 아이디어인지 여부는 시나리오에 따라 다릅니다. 사람들이 포인터를 std :: vector로 가져올 수 없다면 사람들은 꽤 불만 스러울 것이라고 생각합니다. –
흠. 나는 항상 벡터를 컨테이너로 생각했지만, 당신이 옳습니다. –
개인 멤버에 대한 포인터를 선언한다고해서 반드시 캡슐화가 무효화되는 것은 아닙니다. 어떤 전복이 일어날 수있는 유일한 기회는 포인터가 멤버보다 더 쉽게 접근 할 수있는 경우입니다. OP의 아무 것도 그것이 사실이 아니라고 제안합니다. – AnT
질문의 문구는 다소 혼란 스럽습니다. 누군가가 "무언가에"에 대한 포인터를 선언한다고 말하면, 그들은 일반적으로 "int
에 대한 포인터 선언"에서와 같이 포인터의 유형 관련 속성에 대해 이야기합니다. 비공개가되는 속성은 구성원의 유형에 전혀 영향을주지 않습니다. 즉, 형식이 int
인 구성원이 공개인지 비공개인지에 관계없이 항상 int
유형의 구성원입니다. 즉, 형식 int *
의 포인터는 항상 int
공용 멤버 또는 int
개인 멤버를 가리 키도록 지정할 수 있습니다. 회원이 공개인지 비공개인지는 중요하지 않습니다.
C++에서 일반 포인터 (예 : int *
)가 있고 포인터가 "member-to-pointer"유형 (예 : int MyClass::*
) 인 경우가 있습니다. "클래스의 데이터 멤버에 대한 포인터"라고 말하면, 포인터의 종류가 일반 포인터인지 멤버 포인터인지는 명확하지 않습니다. 그러나 위의 두 가지 모두에 적용됩니다. 둘 다 쉽게 클래스의 공용, 보호 또는 비공개 멤버를 가리킬 수 있습니다. 사생활은 아무런 차이가 없습니다.
"개인용"속성은 멤버의 유형에 영향을 미치지 않으며 이름으로 직접 참조 될 때 액세스 가능성에만 영향을줍니다. 그래서 포인터를 클래스의 private 데이터 멤버를 가리 키도록하려면 해당 개인 데이터 멤버가 액세스 할 수있는 영역에서 포인터를 초기화 (또는 할당)해야합니다. 소유 클래스 또는 내부 메소드 친구 기능.
대답, 그것은 의견입니다. – ThomasMcLeod
댓글이 아닙니다. 가능한 모든 해석에 대한 완전한 설명입니다. –
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
- 1. 클래스 멤버에 대한 포인터
- 2. 정적 클래스 멤버에 대한 함수 포인터?
- 3. 클래스의 struct 멤버에 대한 기본 초기화 값
- 4. 개인 클래스의 멤버 액세스
- 5. "variable"클래스의 멤버에 액세스
- 6. C++ 개인 포인터 "유출"?
- 7. 회원 전환에 대한 포인터
- 8. 같은 클래스의 비공개 멤버에 대한 포인터를 취하는 private 멤버 함수
- 9. 클래스의 lisp 파일 포인터
- 10. 부모 클래스의 멤버 함수에 대한 함수 포인터
- 11. 다른 클래스의 폼 멤버에 액세스
- 12. 벡터를 사용하여 클래스의 멤버에 액세스
- 13. 부분 클래스의 공유 멤버에 액세스
- 14. swig (또는 Boost :: Python)의 멤버에 대한 포인터
- 15. 다른 개체의 멤버에 대한 포인터 또는 참조 얻기
- 16. 클래스의 개인 생성자 사용
- 17. 개인 클래스의 생성자 정의
- 18. 멤버에 대한 액세스 규칙에 대한 이름입니다.
- 19. 중첩 클래스의 '액세스하는 클래스에 대한 액세스'개인 데이터 멤버
- 20. 클래스의 포인터 초기화
- 21. 포인터 문제에 대한 포인터
- 22. 멤버에 대한 포인터의 오프셋
- 23. Python ~ 템플릿 클래스의 튜플 멤버에 액세스하기
- 24. 함수에 대한 C++ 정적 포인터
- 25. C# - 클래스의 인스턴스가 있으면 클래스의 정적 멤버에 어떻게 액세스하나요?
- 26. 파생 클래스에서 클래스의 보호 된 멤버에 액세스
- 27. 부분 클래스의 나머지 절반의 멤버에 액세스
- 28. 데이터 멤버에 직접 액세스하는 것은 나쁜 습관입니까?
- 29. 왜 파스칼은 메서드의 매개 변수와 클래스의 데이터 멤버에 대해 동일한 식별자 이름을 사용할 수 없습니까?
- 30. 데이터 세그먼트의 텍스트 세그먼트에 대한 포인터
를? –
내 잘못 했어. – xil3