Допустим, у меня две разные функции. Один является частью класса BST, другой - просто вспомогательной функцией, которая будет вызывать эту функцию класса. Я перечислю их здесь.
sieve(BST<T>* t, int n);
эта функция вызывается так: sieve (t, n) объект называется BST t;
Я собираюсь использовать функцию удаления класса внутри функции сита для удаления определенных объектов. Я не уверен, как должен выглядеть мой прототип этой базовой функции? Делая это:
sieve(BST<int> t, int n)
Здесь происходит то, что все компилируется нормально, но когда вызывается функция t.remove, я не вижу реальных результатов. Я предполагаю, потому что он просто создает копию или целый другой объект t вместо того, чтобы передавать его из моей функции main ().
Если я вызываю функцию удаления (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)
& определяет передачу по Справка, а не по значению. :-)
Подпись:
/* missing return type */ sieve<BST<int> t, int n);
фактически сделает копию BST<int>, переданного в sieve(). Таким образом, любые изменения, которые вы внесете в него, будут отброшены (если вы не вернете его копию).
Вероятно, вам нужно что-то вроде:
void sieve<BST<int> & t, int n);
который передает ссылку, поэтому любые изменения, которые вы вносите в t внутри метода, вносятся в объект, который вы передали (а не в копию).
Как только вы это поймете и поймете, вы, вероятно, захотите сделать функцию sieve() «шаблоном функции», чтобы она могла принимать BST<>, содержащий любой тип.
Если я правильно понимаю вашу проблему, вам следует использовать
BST t;
sieve(BST<T> *t, int n);
и вызвать его как:
sieve(&t,n)
передача указателя на объект t
ИЛИ ЖЕ
BST t;
sieve(BST<T> &t, int n);
и вызвать его как:
sieve(t,n)
передача ссылки на объект t
Мне этот ответ больше нравится. Передача по ссылке или указателю выполняет то же самое. Единственная разница - это уровень косвенного обращения.
What happens here is everything compiles just fine, but when t.remove function is called I see no actual results. I'm assuming because it's just creating a copy or a whole other t object instead of passing the one from my main() function.
Правильный. Именно это и происходит, потому что в C++ параметры передаются функциям по значению. Передача ссылки или указателя решит вашу проблему. Использование ссылки чище.
Во втором блоке кода у вас есть два <и один>