2016-03-28 42 views
0

我正在使用的這本書要求我使用C++中的構造函數來實現LIFO堆棧。第一個實現相當簡單,因爲它希望我通過引用將函數中的對象傳遞給函數(所以下面的代碼在pushexternal函數中有一個額外的&)。 但是,我不知道如何正確實現它的第二個版本。它希望我通過價值傳遞對象來實現它。因此,它創建了對象的副本,並且在堆棧上使用推送函數後,推送的元素不見了。我不知道如何正確地做到這一點。我正在考慮使用複製構造函數,但我試過了,它似乎不起作用...按值傳遞對象並在C++中修改它

這是寫在書中的代碼。我不應該修改它,我只能寫我自己的類/附加功能:

void pushexternal(Stack s, int a) { 
    s.push(a); 
} 

int main() { 
    Stack s; 
    s.push(0); 
    s.push(1); 
    s.push(2); 
    pushexternal(s, 3); 
    pushexternal(s, 4); 
    return 0; 
} 

這是我實現的一部分:

#include <iostream> 
using namespace std; 

class Stack { 
public: 
int ind; 
int * arr; 

Stack() 
{ 
    arr = new int[25]; 
    ind = -1; 
} 
~Stack() 
{ 
    delete [] arr; 
} 

void push(int val) 
{ 
    arr[++ind] = val; 
    cout << "Added " << arr[ind] << " to " << ind << endl; 
} 
}; 

我知道,路過值不建議在這裏,但我真的想知道,如果通過值是強制性的,我怎麼才能使它正常工作。我唯一想到的是寫一些複製構造函數......? 當然,我的代碼不能在這裏工作,因爲它使一個副本應該推動一個變量,但是當通過值傳遞時,當它退出函數時它就消失了...

該程序的結果應該是這樣的:

Added 0 to 0 
    Added 1 to 1 
    Added 2 to 2 
    Added 3 to 3 
    Added 4 to 4 
+0

您可以在實例之間共享由'arr'指向的數組並進行一些引用計數。不過,你也需要共享'int',可能作爲數組的最後一個元素或將被共享的實現結構的成員。通常情況下,通過'std :: shared_ptr'解決這個問題,而不需要重新發明輪子。無論如何,告訴我們你試過了什麼。 – LogicStuff

+0

我不會在這上面花太多時間。按價值收集相當無用且很少使用,至少它們*應該*很少被使用。 – EJP

+0

如果你想通過'堆棧'值到'pushexternal'(即複製堆棧),並且仍然影響原始文件,唯一的方法是使複製操作成爲淺拷貝,即所有拷貝同一個'Stack'實際上共享一個堆棧數據的實例。例如,用'std :: shared_ptr > arr'替換'int * arr'。然而,在代碼設計方面這是一個糟糕的想法。 –

回答

0

如果你要在你的arr成員分配一個額外的成員,然後你可以使用arr[0]而不是ind作爲索引。這樣,即使您的堆棧對象被按值複製,指針仍然會指向相同的內存。

存在類似的,可能更復雜的解決方案,包括讓對象包含一個指向結構的指針,其中包含indarr

+0

'delete [] arr;'會留下懸掛指針的其他堆棧 –