2009-10-07 4 views
1

내가하고있는 (뭔가)이 :C++에서 참조로 전달 된 포인터를 역 참조하는 방법은 무엇입니까?

void insert(Node*& node, string val, Node* parent) 
{ 
    if (node == NULL) 
    instantiateNode(node, val, parent); 
    else 
    insert(node->child, val, node); 
} 

문제는, instantiateNode(..., parent) 원래 *&node 수정하려면 *parent 설정할 때 함수로 전달되는 것 같습니다. instantiateNode()node을 변경하기 위해 로 가정했지만 parent을 변경하면 부모로 설정되는 노드가있는 것보다 의미가 없으며 작동하지 않습니다. 조금도.

포인터 참조를 사용하여 귀찮게하는 이유는 특별한 경우를 제거하고 수행해야 할 오류 검사의 양을 크게 줄이기 때문입니다. 라인 카운트와 사소한 알고리즘 - 쇄 중복을 줄이기 위해이 작업을 수행하고 있기 때문에 코드 줄 수를 두 배로 늘릴 수 있습니다. 하지만 나는 차라리 그렇게하지 않을 것입니다. 은 같은 참조를 가리키는 새로운 포인터를 얻기 위해 포인터 참조를 역 참조하는 방법이되어야합니다. 그리고 실제로 *&node에서 *parent을 통한 패스가이를 수행해야한다고 생각했지만 분명히 gcc가이를 최적화했습니다.

+2

전체 코드를 게시 할 수 있으며 달성하고자하는 것은 무엇입니까? 이것은 꽤 간단한 삽입처럼 보입니다. 왜 포인터 참조를 다루고 있습니까? – Uri

+0

질문이 불분명합니다. instantiateNode를 게시하지 않으시겠습니까? 그것은 노드 포인터를 수정해야하고 (그리고 모든 것이 부모를 수정할 수 있어야합니다) 오히려 나에게 기대할 수 있습니다. – UncleBens

+0

찾고있는 코드 스 니펫의 동작이 어떻게 변경되었는지는 분명하지 않습니다. 나는'node'를 참조로 전달하는 전체 지점이 함수 내부에서 수정 될 수 있다고 가정합니다. 또한 함수 이름'instantiateNode'는 아마도 매개 변수를 수정하여 새 노드를 만들 것이라고 제안하는 것 같습니다. 그리고 포인터 복사에 대해서'Node * copy = node; '를 의미합니까? – sth

답변

4

이 같은 가리키는 새 포인터를 얻을 수있는 포인터 참조 역 참조 할 수있는 방법이 있어야한다 목적.

글쎄, 어때?

Node* n = node; 

이제 노드와 동일한 객체를 가리키는 참조가 아닌 포인터가 있습니다.

저는 여러분이 직면하고있는 문제가 참조와 관련이 없으며 instantiateNode 또는 그 사용에있어 잘못된 논리와 관련이 있다고 확신합니다. 따라서 코드가 수행해야하는 작업에 대한 정보를 추가로 제공하거나 instantiateNode에 코드를 게시하는 것이 유용 할 수 있습니다.

+0

당신은 절대적으로 옳습니다. 내 자신을 세부 사항에 몰두하게 만들었지 만 초기에 시도했지만 gdb는 그것이 여전히 잘못된 것을 가리키고 있음을 암시합니다. 하지만'Node * n = & (* node);를 실행한다고해도 문제가 해결되지 않으므로 운이 좋지 않거나 바보 같을 수도 있습니다. 작은 함수이지만, 필자는 그것과 매우 비슷한 톤을 썼고, 필자는 그것을 다시 썼다. 얼마나 많은 시간이 걸릴지조차 모르고, 그래서 나는 아직도 무슨 일이 일어나고 있는지 확신 할 수 없다. . 알아 내면 돌아올거야. – quodlibetor

3

node는 포인터에 대한 참조입니다. 즉, 함수가 node를 설정하면 전달 된 값이 변경됩니다. 이것이 참조가 작동하는 방식입니다.

노드가 호출 기능에서 변경되지 않도록하려면 참조로 만들지 마십시오.

아니면 내가 잘못 이해 한 적이 있습니까?

+0

아니, 네 말이 맞아. 나는 노드를 바꾸고 싶다. 하지만'insert()'에'parent' (참조가 아닌)로 전달하면 복사되어야하고'parent'는'node'와 같은 위치를 가리키는 새로운 포인터 여야한다고 생각합니다 이전 함수에서. – quodlibetor

+0

하지만'parent '를'insert()'에 넘겨주지는 않습니다. –

+0

'insert()'가 노드의 자식에서 작동하기 때문에'node'는'parent'가됩니다. 서명 :'insert (node, item, parent)'. 호출 :'insert (node-> child, item, node) ' – quodlibetor

0

node을 참조로 전달해야한다고 생각하지 않습니다. 간단한 포인터가 작업을 수행해야합니다. 이는 직접 변경하지 않아도되기 때문입니다. 왜 이것을 instantiateNode()에게 건네 주십니까? 항상 NULL이 될 것이므로 어떤 이점이 있습니까? instantiateNode()에 첫 번째 인수가 참조로 전달 된 경우 이유는 무엇입니까? 부모님을 지나가므로 nodeparent->child을 통해 표시해야하는 내용에 instantiateNode()이 액세스 할 수 있습니다. 어떤 이유로 든 instantiateNode()이 참조로 param을 가져 왔고 그렇게해야한다고하더라도 insert()의 첫 번째 인수에서 참조를 삭제하면이 함수가 여전히 작동 할 것으로 생각됩니다. 그 값으로 instantiateNode()이 무엇이든간에 함수가 반환 될 때 단순히 손실됩니다. 죄송합니다. 너무 혼란 스럽지만, 더 나은 방법을 생각할 수는 없습니다. 문제의 또 다른 해석이있다

... 어쩌면 insert()에 전화 읽어야합니다

insert(node, val, node->child); 
+0

코드는 목록을 작성하는 것으로 보이며, lasts 노드 하위에 추가합니다 (즉, child == 0 인 경우). 그것이 무엇을해야한다고 생각하면 그것은 나에게 잘 보입니다. –

+0

어떤 일이 일어나는가하면 그것을 전달하고, NULL이면 새 아이를 설정합니다. 그래서 실제로 포인터 자체에 영향을 미치고 있습니다. 그것은 조건 검사의 전체를 많이함으로써 작은 곡예로 할 수 있습니다. 내가 이렇게하는 이유는 그것이 3-5 나무이기 때문입니다. 모든 루프에서 3-5 가지를 확인하고 싶지는 않습니다. – quodlibetor

관련 문제