문제

그래서 두 가지 다른 기능이 있다고 가정 해 봅시다. 하나는 BST 클래스의 일부이며, 하나는 해당 클래스 기능을 호출하는 도우미 기능 일뿐입니다. 여기에 나열하겠습니다.

sieve(BST<T>* t, int n);

이 함수는 다음과 같이 불린다 : sieve (t, n) 물체를 bst t라고한다.

Sieve 함수 내에서 클래스 제거 기능을 사용하여 특정 객체를 제거 할 것입니다. 이 기본 기능에 대한 내 프로토 타입이 어떻게 생겼는지 잘 모르겠습니다. 이것을하는 것 :

sieve(BST<int> t, int n)

여기서 일어나는 일은 모든 것이 잘 편집되어 있지만 t.remove 함수라고 할 때 실제 결과는 보이지 않습니다. 내 main () 함수에서 하나를 전달하는 대신 사본이나 다른 t 객체를 만들고 있기 때문에 가정합니다.

원래 객체가 생성 된 주 함수에서 제거 함수 (t.remove (value))를 호출하면 모든 것을 올바르게 제거합니다. 내 체 기능을 통해 작업을 시작하면 기본 기능에서 인쇄 할 때 변경 사항이 없습니다. 내 주요 기능은 다음과 같습니다.

int main ()
{
   int n,
       i,
       len;

   BST<int> t;

   cin >> n;
   vector<int> v(n);

   srand(1);

   for (i = 0; i < n; i++)
      v[i] = rand() % n;

   for (i = 0; i < n; i++)
      t.insert(v[i]);
       print_stat(t);
   t.inOrder(print_data);



   sieve(v,t,n);
   print_stat(t);
   t.inOrder(print_data);
   return 0;
}

함수 내의 디버그 진술이 실제로 무언가를 삭제하고 있음을 보여 주지만 결과는 동일합니다. 내가 어디에서 잘못 될지 추측하는 것은 t 객체를 함수에 전달하는 방법입니다.

도움이 되었습니까?

해결책

sieve(BST<int>& t, int n)

그만큼 & 지나가는 것을 지정합니다 참조 가치보다는. :-)

다른 팁

내가 당신의 문제를 정확하게 이해한다면, 당신은

BST t;    
sieve(BST<T> *t, int n);

다음과 같이 호출하십시오.

sieve(&t,n)

포인터를 전달합니다 t 물체

또는

BST t; 
sieve(BST<T> &t, int n);

다음과 같이 호출하십시오.

sieve(t,n)

참조를 전달합니다 t 물체

서명 :

/* missing return type */ sieve<BST<int> t, int n);

실제로, BST<int> 통과했습니다 sieve(). 따라서 변경 사항은 사본을 반환하지 않는 한 버려집니다.

당신은 아마도 다음과 같은 것을 원할 것입니다.

void sieve<BST<int> & t, int n);

참조로 전달되므로 수정 사항이 있습니다. t 방법 내부는 당신이 통과 한 객체 (사본이 아님)로 만들어집니다.

일단 당신이 그것을 내려 놓고 그것을 이해하면, 당신은 아마 sieve() "함수 템플릿"기능을 사용하여 BST<> 모든 유형을 포함합니다.

여기서 일어나는 일은 모든 것이 잘 편집되어 있지만 t.remove 함수라고 할 때 실제 결과는 보이지 않습니다. 내 main () 함수에서 하나를 전달하는 대신 사본이나 다른 t 객체를 만들고 있기 때문에 가정합니다.

옳은. C ++에서 매개 변수가 값에 따라 unfuncitons에 전달되기 때문에 정확히 발생합니다. 참조 또는 포인터를 전달하면 문제가 해결됩니다. 참조를 사용하는 것이 더 깨끗합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top