2008-10-30 39 views
1

所以我们假设我有两个不同的函数。一个是BST类的一部分,另一个只是一个帮助函数,它将调用该类的函数。我会在这里列出来。将一个Class对象传递给一个函数(可能通过指针而不是引用)C++

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

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

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

sieve(BST<int> t, int n) 

这里会发生什么事是一切编译得很好,但是当t.remove函数被调用我看不出有什么实际效果。我假设,因为它只是创建一个副本或整个其他t对象,而不是从我的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对象传递给函数。

+0

在你的第二个代码块中,你有两个< and one > – John 2008-10-30 19:05:15

回答

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

&指定由引用传递而非值。 :-)

2

签名:

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

会,实际上使BST<int>sieve()传递的副本。所以你对它做出的任何修改都将被丢弃(除非你返回了它的副本)。

你可能想是这样的:

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

它在传递一个参考,让您对t任何修改的方法内侧到您在传递的对象(不是复制)制成。

一旦你明白了这一点,你可能会想让sieve()函数成为“函数模板”,以便它可以包含任何类型的BST<>

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

+0

我更喜欢这个答案。通过引用或指针传递完成相同的事情。唯一的区别是所使用的间接级别。 – spoulson 2008-10-30 19:36:32

1

这里会发生什么事是一切编译得很好,但是当t.remove函数被调用我看不出有什么实际效果。我假设,因为它只是创建一个副本或整个其他t对象,而不是从我的main()函数传递一个。

正确。这正是发生的情况,因为在C++中,参数通过值传递给函数。传递引用或指针可以解决您的问题。使用参考更清洁。

相关问题