![](/img/trans.png)
[英]C++ Passing a pointer (pointing to an object) to function in another class
[英]Passing a Class Object to a function (probably by pointer not reference) C++
所以假设我有两个不同的功能。 一个是 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)
&
指定通过引用而不是值传递。 :-)
如果我正确理解您的问题,您应该使用
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);
事实上,会复制传递给sieve()
的BST<int>
。 因此,您对它所做的任何更改都将被丢弃(除非您返回它的副本)。
你可能想要这样的东西:
void sieve<BST<int> & t, int n);
它传入一个引用,因此您在方法内对t
所做的任何修改都会对您传入的对象(不是副本)进行。
一旦你理解并理解了它,你可能希望将sieve()
函数变成一个“函数模板”,这样它就可以接受一个包含任何类型的BST<>
。
这里发生的事情是一切都编译得很好,但是当调用 t.remove 函数时,我看不到实际结果。 我假设是因为它只是创建一个副本或一个完整的其他 t 对象,而不是从我的 main() 函数中传递一个。
正确的。 这正是发生的事情,因为在 C++ 中,参数是按值传递给函数的。 传递引用或指针将解决您的问题。 使用引用更干净。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.