使用外部函数进行堆栈推送

时间:2016-03-26 14:19:48

标签: c++ class stack

我试图在C ++中使用构造函数实现堆栈。我需要使用外部函数将元素推入堆栈,但是,它似乎无法正常工作。 pushexternal函数似乎"进入" push函数,但它不会增加ind值,因此它不会将新元素添加到堆栈中(例如,在我的代码中,所有pushxternals都会尝试将值推送到同一个索引上, s.push使用的最后一个 - ind == 2)。我不确定我做错了什么。

哦,我只能修改类代码 - pushexternal和main必须保持不变。

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

void top()
{
    cout << "Last: " << arr[ind];
}
};

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);
    pushexternal(s, 5);
    return 0;
}

结果:

Added 0 to 0
Added 1 to 1
Added 2 to 2
Added 3 to 3
Added 4 to 3
Added 5 to 3
Top: 2

2 个答案:

答案 0 :(得分:2)

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

接收Stack作为参数,这意味着它接收一个对象,该对象是对象的副本。

你应该对引用进行操作,这样你就不会发送要操纵的对象的副本,而是对象的引用,因此原始对象将被操纵。

答案 1 :(得分:1)

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

您正在通过值将Stack对象传递给此函数,而不是通过引用传递。这会生成原始Stack对象的临时副本,因此原始对象保持不变。更不用说这会导致内存损坏,因为违反了RAII原则。

正如抽奖的好运,我猜,你的代码不是分裂。