2016-11-22 2 views
-1

클래스 자체를 가리 키도록 포인터를 클래스 멤버에 할당하는 방법이 있습니까?"pointer-to-member"를 자기에게 할당하기

이것은 클래스의 인스턴스에 멤버 포인터를 적용한 결과가 바로 그 인스턴스에 대한 참조가된다는 것을 의미합니다.

예 :

struct SFoo {}; 

constexpr SFoo SFoo::* MP_foo = &SFoo:: MYSELF; 
// Is there some syntax I can use here? --^ 

나는 이것이 내가 임의의 템플릿 유형의 요소의 컨테이너에 작동하는 정렬 알고리즘을 가지고 있습니다 원하는 이유. 정렬 키는 제공된 요소 대 포인터를 사용하여 각 요소에서 가져옵니다.

그러나 이제는 요소가 이고 또한 인 컨테이너를 정렬하려고합니다. 따라서, 멤버 포인터가 자신을 가리 키도록해야합니다 (클래스가 자체 멤버 인 것처럼).

가 나는 (내가 지금 하나를 사용하고 있습니다)를 사용할 수 있습니다 쉽게 (제로 비용) 해킹의 수는 있지만, 나는 그것이 바로을 완수하는 데 사용할 수있는 몇 가지 구문 트릭이 있는지 알고 싶어요 way - 여분의 부끄러운 코드를 피하십시오.

+6

이것은 의미가 없습니다. 클래스 멤버에 대한 포인터는 클래스 멤버에 대한 포인터입니다. 그것이 클래스 멤버에 대한 포인터가되고, 클래스 자체의 인스턴스처럼 다른 것에 대한 포인터가 아닙니다. 클래스 멤버에 대한 포인터라는 것을 언급 했습니까? –

+2

당신은 생성자의 주소를 취할 수 없습니다 – Danh

+2

이것은 [XYproblem] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)이며 나는 당신이 Y , 즉 왜 (일부 정렬, 예, 정확히 정렬하는지) 필요하며 "쉽고 (비용이 들지 않는) 해킹"이 필요하다는 것을 보여줍니다. 그들에게 어떤 문제가 있습니까?쉽고 비용이 들지 않으면 왜 사용하지 않으시겠습니까? – user463035818

답변

1

불행히도 질문은 명확하지 않습니다 (하지만 -1은 내 것이 아닙니다). 내 인상은 당신이 (당신의 경우 이것은 SFoo입니다) 정렬 될 개체의 유형과 정렬 키의 유형을 혼란스럽게합니다. 일반적인 상황에서는 서로 다릅니다. 예 : 정렬 할 사용자 (개체) 및 정렬 키는 이름과 성 (문자열 쌍)입니다. 정렬 키 유형을 직접 언급하지는 않습니다.

구문 상 SFoo SFoo::* MP_foo은 유형이 SFoo 인 인스턴스 필드에 대한 포인터입니다. C++에서는 그렇게하지 않으면 무한 재귀가 발생하기 때문에 허용하지 않습니다. 이 필드에는 SFoo 파일이 있고 내부 필드에는이 필드가 다시 있어야합니다.

둘째, 함수에 대한 포인터로 데이터에 대한 포인터를 초기화하려고합니다. 생성자 SFoo::SFoo은 함수입니다. 그리고 주석에 언급 된 바와 같이, ctors의 주소는 허용되지 않습니다.

한 번 더 시도 : 클래스의 인스턴스에 멤버 포인터를 적용하면 바로 그 인스턴스에 대한 참조가됩니다.

회원에 대한 포인터는 회원을 가리 킵니다. 개체가 해당 멤버가 아닙니다. 좋든 나쁘 든 이것은 C++가 정의 된 방법입니다. 메모리 레이아웃의 관점에서 그들이 동일 할 것

struct SFoo2 
{ 
    SFoo m_data_field; 
}; 

참고 :

당신은 래퍼 클래스, 같은 것을 정의하기 위해 시도 할 수 있습니다. SFoo2SFoo 유형의 멤버에 대한 포인터를 가질 수 있습니다. 나는 이것이 당신의 상황에서 효과가 있을지 모르지만, 시도해 볼 수 있습니다.

+0

나는 그 대답이 단지 "아니오"라고 생각한다. 하지만 문제의 어느 부분이 명확하지 않아서 고칠 수 있는지 말해 줄 수 있습니까? // 정렬 된 객체 _ 키의 경우. 마치 문자열을 포함하는 객체가 아닌 값으로 문자열 집합을 정렬하는 것과 같습니다. 그러나 내 정렬 코드는 멤버 포인터를 염두에두고 작성되었습니다. // SFoo :: SFoo는 ctor (일반적으로)를 의미하지만, 내 의도를 전달하는 가장 좋은 방법이라고 느꼈습니다. – xaxazak

+0

바라건대 올바른 방향으로 몇 가지 설명을했습니다. – xaxazak

+0

"회원 포인터가 회원을 가리키고 포인터가 해당 회원이 아니므로 C++ 정의 방법이 좋든 나쁘 든"입니다. 기본적으로, 나는 그것을 허용하는 것에 문제가있을 것이라는 것을 확신하지 못한다. (self-referencing 및 self-recursiveness는 AFAICT에 문제가되지 않는다.)하지만 그것은 구현되지 않았다. – xaxazak

관련 문제