按值传递对象并在C++; 我正在使用的书希望我用C++中的构造函数实现LIFO栈。第一个实现相当简单,因为它希望我通过引用在函数中传递对象(因此下面的代码有一个附加的&in-pushexternal函数)。 但是,我不知道如何正确地实现它的第二个版本。它希望我通过传递对象的值来实现它。因此,它创建对象的副本,在堆栈上使用push函数后,push元素就消失了。我不知道在通过值传递它时如何正确地执行它。我想用一个复制构造函数,但我试过了,它似乎不起作用

按值传递对象并在C++; 我正在使用的书希望我用C++中的构造函数实现LIFO栈。第一个实现相当简单,因为它希望我通过引用在函数中传递对象(因此下面的代码有一个附加的&in-pushexternal函数)。 但是,我不知道如何正确地实现它的第二个版本。它希望我通过传递对象的值来实现它。因此,它创建对象的副本,在堆栈上使用push函数后,push元素就消失了。我不知道在通过值传递它时如何正确地执行它。我想用一个复制构造函数,但我试过了,它似乎不起作用,c++,class,object,C++,Class,Object,这是书中写的代码。我不应该修改它,我只能编写自己的类/附加函数: 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 <ios

这是书中写的代码。我不应该修改它,我只能编写自己的类/附加函数:

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;
}
};

如果要在
arr
成员中分配额外的成员,则可以使用
arr[0]
而不是
ind
作为索引。这样,即使堆栈对象是按值复制的,
arr
指针仍将指向相同的内存


类似的,可能存在更复杂的解决方案,包括让对象包含一个指向结构的指针,其中包含
ind
arr

您可以在实例之间共享
arr
指向的数组,并进行一些引用计数。您还需要共享
int
,可能是作为数组的最后一个元素或将被共享的实现结构的成员。人们通常可以通过
std::shared_ptr
解决这个问题,而无需重新发明轮子。不管怎样,让我们看看你试过什么。我不会在这上面花太多时间的。按值收集是相当无用且很少使用的,至少它们应该很少使用。如果要按值将
堆栈
传递到
pushexternal
(即复制堆栈),并使其仍然影响原始文件,唯一的方法是使复制操作成为浅层复制,即,相同
堆栈的所有副本实际上共享堆栈数据的单个实例。例如,将
int*arr
替换为
std::shared\u ptr arr
。然而,就代码设计而言,这是一个糟糕的想法。也许重读这本书,看看他们到底想让你做什么?这本书是否提供了一个“答案”,你可以查看他们想要什么?
delete[]arr
将使用悬空指针离开其他堆栈
    Added 0 to 0
    Added 1 to 1
    Added 2 to 2
    Added 3 to 3
    Added 4 to 4