2013-05-17 3 views
0

"포인터"는 "Int"의 주소를 보유합니다. 나는 참고로 내 주어진 클래스에 해당 주소를 전달하려는 :C++에서 참조로 클래스에 주소를 전달하고 "자식 클래스"에

class N { 
public: 
    N(int &pPointer){ 
     std::cout << "Address: " << &(pPointer) <<" \n"; 
    } 
}; 
class M { 
public: 
    M(int &pPointer):n(pPointer) {    
     std::cout << "Address: " << &pPointer <<" \n"; 
    } 
    private: 
    N n; 
}; 

int main() { 
    int Int = 5; 
    int *pointer = &Int;  
    std::cout << "Address: " << pointer <<" \n"; 
    M m(*pointer); 
    return 0; 
} 

이 좋습니다 (나는 종류의 역 참조 포인터에 대한 참조를 사용하고 있기 때문에)? 아니면 절대적으로 끔찍한가요? 단순히 포인터를 여기에서 피하고 싶습니다. (처음에는 "* pointer"를 사용해야 만합니다.)

+1

왜 처음에는'* pointer'를 사용해야합니까? 왜 그냥'M m (Int);를 사용하지 않을까요? –

+0

좋은 질문입니다! 내 프로젝트에서 일부 렌더링 기능에 "전역"화면을 전달하고 싶습니다. 화면은 SDL_Surface에 대한 포인터 여야합니다. 왜냐하면 초기 함수 SDL_SetVideoMode가 SDL_Surface에 대한 포인터를 반환하기 때문입니다. 여기를보십시오 : http://www.libsdl.org/docs/html/sdlsetvideomode.html – user1511417

답변

0

필자는 꼭해야하지만 함수 매개 변수 대신 상수 참조 N(const int& pPointer)을 사용하는 것이 좋습니다. 즉, 포인터가 다른 것을 가리 키도록 변경할 수는 없지만 참조를 사용하여 기본 변수 값을 수정할 수는 있습니다.

참조를 클래스에 데이터 멤버로 저장하더라도주의해야합니다. 호출자의 객체 (귀하의 경우 int)가 범위를 벗어나면 'dangling reference'로 끝날 수 있습니다.

+0

이것은 저에게 의미가 없습니다. 참조는 항상 한 번만 "참조"할 수 있기 때문에 항상 const입니다. (반면 포인터는 런타임 중에 다른 것들을 가리킬 수 있습니다.) 그리고 "pPointer"가 "Int"를 변경할 수있게하고 싶습니다. – user1511417

+0

아닙니다. 참조가 POD가 아닌 객체 인 경우 해당 객체에서 비 const 함수를 호출하거나 구성원 데이터를 수정할 수 없습니다. POD의 경우 참조를 수정할 수 없습니다 (예 : int k = 8; const int & l = k; l = 9; 무효이지만 int k = 8; int & l = k; l = 9; 괜찮습니다. – Bathsheba

+0

하지만 제가 말했던 것처럼, 클래스 N의 pPointer (예제 "l")에서 "Int"(예제 "k")를 변경할 수있게하고 싶습니다. – user1511417

1

사용중인 포인터가 유효하다는 것을 알고 있으므로 나중에 포인터를 사용하여 포인터를 전달하는 대신에 참조로 전달하는 것이 좋습니다. 참조는 null 일 수 없기 때문에 nullptr 검사를 건너 뛸 수 있습니다.
그러나 참조를 저장하면 참조되는 개체를 다른 개체로 대체 할 수 없습니다. 하지만 포인터로 할 수 있습니다.
나중에 참조 된 개체의 주소를 가져올 수 있지만 실제로는 이 필요하다고 생각하십니까? 대신 참조를 사용할 수 있기 때문에