【问题标题】:Stack push using external function使用外部函数进行堆栈推送
【发布时间】:2016-07-14 04:16:58
【问题描述】:

我正在尝试使用 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

【问题讨论】:

    标签: c++ class stack


    【解决方案1】:
    void pushexternal(Stack s, int a) {
        s.push(a);
    }
    

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

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

    【讨论】:

    • 谢谢,通过引用传递可以正常工作。但是,它需要我更改 pushexternal 函数 (void pushexternal(Stack &s, int a))。在这个任务中,我正在使用的书希望我保持 pushexternal 和 main 函数不变,只更改我的类的代码。我不确定,因为我还没有尝试过,但在这种情况下会使用复制构造器帮助吗?
    • 复制构造函数用于使用来自现有对象的数据初始化对象。这对您没有帮助,因为您的函数从函数参数中获取 Stack 并对其进行操作。我的猜测是,这个例子要么是错误的,要么是书想让你找到“错误”。
    【解决方案2】:
    void pushexternal(Stack s, int a) {
        s.push(a);
    }
    

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

    我猜你的代码没有段错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-25
      • 1970-01-01
      • 2017-03-02
      • 2018-08-20
      • 2020-12-19
      • 2019-03-08
      • 2013-03-07
      • 1970-01-01
      相关资源
      最近更新 更多