2012-07-02 3 views
1

배열 (std::vector<foo**>) 때문에 this에 대한 포인터를 반환하는 코드 줄을 작성하고 싶습니다. 내가 참조 (&this)를 사용하는 줄 알았지 만 작동하지 않았다.C++에서 this 포인터

설명이 필요하면 알려주십시오.

편집 : 내가하고있는 일을 명확히하기 위해 배열을 사용하여 개체에 직접 액세스하려고합니다. 이렇게 : (*ARRAY.at(i))->foo("bar");. 어떤 사람들은 포인터를 만드는 것이 불가능하다고 말합니다. 그렇다면 배열을 사용하여 객체에 직접 액세스하려면 어떻게해야합니까?

+6

는'표준 : : 벡터 '아주 나쁜 생각처럼 보인다. – leftaroundabout

+0

'this'는 특히 개체의 인스턴스에 대한 포인터입니다. 'this '에 대한 포인터를 반환하는 것은 클래스 외부에서 내부 인스턴스를 변경 함을 의미합니다. 그것은 아마 나쁠 것입니다. 뭐하고 있니? – AJG85

+0

"* 나는 참조 ('& this')를 사용한다고 생각했지만 작동하지 않았다. *"this *'을 의미합니까? – ildjarn

답변

9

변수가 아니기 때문에 this에 대한 포인터를 사용할 수 없습니다.이 포인터는 현재 개체에 대한 포인터로 변환되는 예약 된 키워드입니다.

컴파일러 구현시 this 포인터를 지원하는 함수의 로컬 변수가있을 수 있지만 구현 세부 사항이며 해당 주소는 프로그래머가 액세스 할 수 없습니다.

당신이 할하려는 것은 매우 악,하지만 당신은 정말 그것을 수행하려는 경우, 당신은 변수를 직접 만들어야합니다 : 당신은 것입니다 미래에

foo** evil_ptr_to_ptr = new foo*(this); 
ARRAY.push_back(evil_ptr_to_ptr); 

및 시간 삭제해야한다 : C++ this에서

// assuming you got all the elements in the array in the same way: 
for(int i = 0; i < ARRAY.size(); ++i) { 
    delete ARRAY[i]; 
} 
+2

ildjarn, 그럼 어떻게? – MiJyn

+0

@lkjoel 주소 연산자 ('&')를 사용합니다. 현재 함수의 스택에있는 포인터의 주소를 반환합니다. –

+0

@ 리차드, 나는 그 ('& this')을 시도하지만 오류 메시지를 제공합니다 : '오류 : 좌변은 – MiJyn

4

는 좌변이 아니다. 이러한 이유로 this에 대한 포인터를 만들 수 없습니다. 매우 동일한 이유로 참조를 직접 this에 바인딩 할 수도 없습니다.

+0

흥미 롭 군. 왜 그것은 (const) lvalue가 아닌가? 확실히 하나처럼 보입니다 (이름과 모두가 있습니다). –

+0

@ Konrad Rudolph : 스칼라 유형의 * rvalues ​​*에 관해서는 const의 개념이 전혀 적용되지 않기 때문에. 스칼라 유형의 Rvalues는 const 또는 비 const 일 수 없습니다. 3.10/9 : "클래스의 값은 cv 수식 된 타입을 가질 수 있고, 비 클래스의 rvalues는 항상 cv가 아닌 수식 타입을 가질 수 있습니다"를 참조하십시오. – AnT

+0

할당 연산자가 과부하되면 'this'에 대한 참조가 정기적으로 반환됩니다 ... 제가'rvalue'라고 추측합니까? – AJG85

0

다른 답변/의견이 지적한대로 this은 그 자체로 포인터입니다.

에 대한 포인터를 사용할 수 있다고하더라도 : this은 실행중인 메소드의 로컬 변수이며 작업중인 객체에 대한 포인터입니다.

this에 대한 포인터를 반환하면 다른 로컬 변수에 대한 포인터를 반환하는 것과 동일한 효과가 있습니다. 즉, 방금 this이라는 범위를 벗어 났기 때문에 가비지가 반환됩니다.

EDIT: To clarify what I'm doing, I'm trying to access the object directly using the array. Like so: (*ARRAY.at(i))->foo("bar");. Some people say it is impossible to make a pointer. If so, how would I access the object directly using the array?

반환 this, 배열에 저장하고,이 같은 접근 :에서 myArray [IDX] -> foo는 ("바")

다시 this은 객체에 대한 포인터입니다.

편집 : this은 숨겨진 메서드 매개 변수로 구현 된 rvalue 식으로 로컬 변수의 수명이 있습니다. :)

+1

'this'는 지역 변수가 아니며'this'는 호출되는 현재 객체의 포인터를 평가하는 좌변 수식입니다. 즉, 일반적으로 함수 매개 변수로 내부적으로 컴파일러에서 구현되며 사용자에게는 표시되지 않습니다. – lvella

+1

@lvella :'this'는 현재 객체의 포인터를 평가하는 ** rvalue ** 표현식입니다. – AnT

2

The this pointer is passed as a hidden argument to all nonstatic member function calls and is available as a local variable within the body of all nonstatic functions.

따라서이 포인터의 주소를 지정하는 것은 효과가 없습니다.

이 비 정적 멤버 함수를 고려하십시오 my_struct에 컴파일러를 호출 할 때

void my_struct::my_func(int a); 

을 후드 아래에이 작업을 수행 :

void my_struct__my_func(my_struct* this, int a); 

는이 포인터가 전달되는 사실을 감안할 때 가치에 의해, 그것의 주소를 가지고가는 것은 당신에게 기능 반환 후에 더 이상 존재하지 않을 무언가의 주소를 줄 것이다.

0

당신은 지금 정답을 많이 가지고 있지만, differentely 그것에 대해 생각하려고 :

당신이 당신의 기억에 약간의 주소에 할당 된 클래스 foo의 객체를 가지고 가정합니다. 이 주소는 수업의 범위에 효과적으로 this으로 표시됩니다. 자, 여러분은 원래 객체의 주소를 유지하는 변수에 또 다른 주소가 필요하다고 말합니다. 이 변수는 선언되어야하고 객체의 수명이 있어야합니다. 분명히 그러한 변수는 기본적으로 존재하지 않습니다. foo**을 컨테이너에 보관하려면 대부분 다른 컨테이너를 foo*으로 유지해야하므로 전자는 후자를 가리킬 수 있습니다. 글쎄요, 다시 말하지만 아마도 그렇게 할 필요가 없을 것입니다. 당신이 문제를 다르게 해결해야만 할 것 같습니까? (당신은 도움이 SO에 문제를 제시하고 싶으 수 있습니다.)