2008-10-30 49 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++中,參數通過值傳遞給函數。傳遞引用或指針可以解決您的問題。使用參考更清潔。

相關問題