按值传递对象并在C ++中修改它

时间:2016-03-28 22:30:20

标签: c++ class object

我正在使用的书希望我使用C ++中的构造函数实现LIFO堆栈。第一个实现相当简单,因为它希望我通过引用传递函数中的对象(因此下面的代码有一个额外的& in pushexternal函数)。 但是,我不知道如何正确实现它的第二个版本。它希望我通过按值传递对象来实现它。因此,它会创建对象的副本,并且在堆栈上使用push函数后,推送的元素就会消失。我不知道如何在按价值传递时正确地做到这一点。我正在考虑以某种方式使用复制构造函数,但我已经尝试过它并且它似乎无法工作......

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

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

1 个答案:

答案 0 :(得分:0)

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

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