Передача объекта класса в функцию (возможно, по указателю, а не по ссылке) C ++ - PullRequest
1 голос
/ 30 октября 2008

Допустим, у меня есть две разные функции. Один является частью класса BST, другой - просто вспомогательная функция, которая будет вызывать эту функцию класса. Я перечислю их здесь.

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

эта функция вызывается так: sieve (t, n) объект называется BST t;

Я собираюсь использовать функцию удаления класса в функции sieve для удаления определенных объектов. Я не уверен, как должен выглядеть мой прототип для этой базовой функции? Делаем это:

sieve(BST<int> t, int n)

То, что происходит здесь, все прекрасно компилируется, но когда вызывается функция t.remove, я не вижу реальных результатов. Я предполагаю, потому что это просто создание копии или целого другого t-объекта вместо передачи одного из моей функции main ().

Если я вызываю функцию удаления (t.remove (значение)) в моей основной функции, где был создан исходный объект, он удаляет все должным образом. Как только я начинаю делать это через свою функцию сита, я не вижу изменений, когда я распечатываю это из моей основной функции. Моя основная функция выглядит примерно так:

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 в функцию.

Ответы [ 4 ]

3 голосов
/ 30 октября 2008

Если я правильно понимаю вашу проблему, вы должны использовать

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

и вызвать его как:

sieve(&t,n)

передает указатель на t объект

OR

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

и вызвать его как:

sieve(t,n)

передача ссылки на t объект

3 голосов
/ 30 октября 2008
sieve(BST<int>& t, int n)

& указывает передачу вместо ссылки , а не значения. : -)

2 голосов
/ 30 октября 2008

Подпись:

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

фактически сделает копию BST<int>, переданного sieve(). Поэтому любые изменения, внесенные в него, будут отброшены (если вы не вернете его копию).

Вы, вероятно, хотите что-то вроде:

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

, который передает ссылку, поэтому любые изменения, которые вы вносите в t внутри метода, производятся в объект, который вы передали (не в копию).

Как только вы разберетесь с этим и поймете это, вы, вероятно, захотите сделать функцию sieve() "шаблоном функции", чтобы она могла принимать BST<>, содержащий любой тип.

1 голос
/ 30 октября 2008

То, что происходит здесь, все прекрасно компилируется, но когда вызывается функция t.remove, я не вижу реальных результатов. Я предполагаю, потому что это просто создание копии или целого другого объекта t вместо передачи одного из моей функции main ().

Правильно. Именно так и происходит, потому что в C ++ параметры передаются в функции по значению. Передача ссылки или указателя решит вашу проблему. Использование ссылки является более чистым.

...