我正在使用的這本書要求我使用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
您可以在實例之間共享由'arr'指向的數組並進行一些引用計數。不過,你也需要共享'int',可能作爲數組的最後一個元素或將被共享的實現結構的成員。通常情況下,通過'std :: shared_ptr'解決這個問題,而不需要重新發明輪子。無論如何,告訴我們你試過了什麼。 – LogicStuff
我不會在這上面花太多時間。按價值收集相當無用且很少使用,至少它們*應該*很少被使用。 – EJP
如果你想通過'堆棧'值到'pushexternal'(即複製堆棧),並且仍然影響原始文件,唯一的方法是使複製操作成爲淺拷貝,即所有拷貝同一個'Stack'實際上共享一個堆棧數據的實例。例如,用'std :: shared_ptr> arr'替換'int * arr'。然而,在代碼設計方面這是一個糟糕的想法。 –