将类对象传递给函数(可能通过指针而不是引用)C ++

时间:2008-10-30 18:58:59

标签: c++ reference arguments

所以我想说我有两个不同的功能。一个是BST类的一部分,一个只是一个调用该类函数的辅助函数。我会在这里列出来。

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

这个函数被调用如下:sieve(t,n)该对象被称为BST t;

我将在sieve函数中使用类remove函数来删除特定对象。我不确定这个基本功能的原型应该是什么样的?这样做:

sieve(BST<int> t, int n)

这里发生的一切都很好,但是当调用t.remove函数时,我看不到实际的结果。我假设因为它只是创建一个副本或整个其他t对象而不是从我的main()函数传递一个。

如果我在创建原始对象的main函数中调用remove函数(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对象传递给函数。

4 个答案:

答案 0 :(得分:3)

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

&指定传递引用而不是值。 : - )

答案 1 :(得分:3)

如果我理解你的问题,你应该使用

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对象

答案 2 :(得分:2)

签名:

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

会将传递给BST<int>的{​​{1}}复制一份。因此,您所做的任何更改都将被丢弃(除非您返回它的副本)。

您可能需要以下内容:

sieve()
传入引用的

,因此您对方法内的void sieve<BST<int> & t, int n); 所做的任何修改都是对您传入的对象(而不是副本)进行的。

一旦理解了它,您可能希望将t函数设为“函数模板”,以便它可以包含任何类型的sieve()

答案 3 :(得分:1)

  

这里发生的一切都很好,但是当调用t.remove函数时,我看不到实际的结果。我假设因为它只是创建一个副本或整个其他t对象而不是从我的main()函数传递一个。

正确。这正是发生的事情,因为在C ++中,参数是按值传递给函数的。传递引用或指针将解决您的问题。使用引用更清晰。