2012-12-01 2 views
0

이러한 함수를 구현하는 방법에 대해 궁금합니다. 나는이 필요 해요main 함수를 호출하는 방법 노드에 대한 참조가 포함되어 있습니다.

int main() { 
Node *n; 
int data; 
foo(data, n); 
return 0; 
} 

:

내가 그 함수를 호출 할 필요가 메인에서 다음
class Node { 
public: 
int dataItem; 
Node *next; 
}; 

void foo(int number, Node & n) { 
// do something 
} 

, 이런 식으로 뭔가가 작동하지 않습니다 예를 들어,

내가 좋아하는 뭔가를 래퍼 함수는 주 노드에서 참조로 노드를 전달하기 때문에 문제가되는 부분을 잘 모르겠습니다. 나는 몇 가지 아이디어를 시도해 보았지만 온라인에서 많은 것을 읽었지 만 나는 그것을 파악하지 못하고있다. 이 래퍼 함수를 ​​구현하는 방법을 이해하는 데 도움이되는 것은 환상적입니다.

답변

4

당신은 Node을 전혀 가지고 있지 않습니다. Node에 대한 포인터가 있는데, 아직 특정 지점을 가리 키지 않았습니다 (data도 초기화되지 않았습니다). 유형 Node&의 참조 매개 변수가 Node 아닌 Node* 통과하도록 요구합니다, 그래서 당신이 정말로 원하는 것은 :

int main() { 
    Node n; 
    int data = 0; 
    foo(data, n); // Pass the Node directly 
    return 0; 
} 

또는 당신이 정말로 포인터를 할 n를 필요한 경우, 다음을 수행 할 수 있습니다 :

int main() { 
    Node* n = new Node(); 
    int data = 0; 
    foo(data, *n); // Dereference n to get the Node it points to 
    delete n; 
    return 0; 
} 

그러나이 상황에서 원시 포인터를 사용하는 것을 권장하지 않습니다. 메모리 누출을 방지하려면 delete을 기억해야합니다. Node* n = new Node() 대신 std::unique_ptr<Node> n(new Node())을 대신 사용할 수 있지만 첫 번째 예와 같이 Node에 자동 저장 기간을 사용하는 것이 훨씬 더 좋습니다.

+0

내가 두 번째 제안에 갔다 노드에 대한 기본 생성자를 생성하고, 그것을 작동합니다. 하지만 메모리 누수에 대한 경고는주의를 기울입니다. 내가 main에 돌아 오기 전에 간단히'delete n '을하는 한, 나는 괜찮을 것이다. –

+0

@DerekW 첫 번째 작업을 수행 할 수없는 이유는 무엇입니까? * 많이 연습하는 것이 좋습니다. –

+0

나는 포인터가 필요하다고 생각했지만, 왜 그것을 달성하려고 하는지를 보면서 미가공 포인터를 사용할 필요는 없다. 그래서 나는 또한 주먹 제안을 구현했고 그것은 실제로 잘 작동하고 있습니다. 당신은 저를 도왔습니다. 정말 고마워요! –

1

함수 fooNode을 참조하지만 포인터를 전달하고 있습니다. 예를 들어, 함수 또는 main()의 코드 중 하나를 변경

int main() { 
Node n; 
int data; // beware, may contain garbage value. 
foo(data, n); 
return 0; 
} 

또는

void foo(int number, Node* n) { 
// do something 
} 
관련 문제