C ++如何在此代码中达到“堆栈”行为?

时间:2019-03-05 20:35:15

标签: c++ pointers

我想问两个有关此代码的问题。在这里,我只是尝试模拟堆栈。

Stack.h

 #pragma once

namespace stackandqueue {

    class Stack
    {
    private:
        int index;
        int *stackdata;

    public:     
        Stack();    
        ~Stack();
        void push(int val);
        int pop();
        int top();
        bool isEmpty();
    };

}

Stack.cpp

#include "stdafx.h"
#include "Stack.h"

namespace stackandqueue {

        Stack::Stack() : index{ 0 }
        {
            stackdata = new int[index];
        }
        Stack::~Stack()
        {
            delete[] &stackdata;
        }
        void Stack::push(int val) {
            stackdata[index] = val;
            index++;
        }
        int Stack::pop() {
            int val = stackdata[index];
            index--;
            return val;
        }
        int Stack::top() {
            return stackdata[index];
        }
        bool Stack::isEmpty() {
            return index == 0;
        }
}

意思是让我创造

 Stack stack;

然后初始化一个动态数组,该数组的第一个索引为0,这让我可以推,弹出,顶值。

第一个问题: 为什么我在方法定义中有未解析的符号?

第二个问题: 关于“ stackdata”,如果我要为此行为声明一个具有动态大小的“数组”,您会找到正确的方法吗?

我愿意寻求改进和最佳实践。我曾经使用过编程语言,但是我从来没有研究过C ++,也不想有不好的习惯。所以你看我从一开始就接受它。

谢谢。


我在您的帮助下发布了可以帮助某人的解决方案。

class Stack
    {
    private:
        int index;
        int* stackdata;

    public:     
        Stack(int size);    
        ~Stack();
        void push(int val);
        int pop();
        int top();
        bool isEmpty();
    };

    Stack::Stack(int size) 
        : index {0}, stackdata{new int[size]} 
        {
        }
        Stack::~Stack()
        {
            delete[] stackdata;
        }
        void Stack::push(int val) {
            stackdata[index] = val;
            index++;
        }
        int Stack::pop() {
            index--;
            return stackdata[index];
        }
        int Stack::top() {
            return stackdata[index-1];
        }
        bool Stack::isEmpty() {
            return index == 0;
        }

1 个答案:

答案 0 :(得分:5)

这有几个问题。

  1. 动态分配或以其他方式分配的数组不是堆栈/队列/向量。您正在创建0个int。之后,所有元素访问都具有未定义的行为。您需要数组增长,即成为向量,例如std::vector

  2. delete[] &stackdata的间接级别错误。您的意思是delete[] stackdata。您正在尝试删除未动态分配的指针

  3. 您缺少复制/移动构造函数和复制/移动赋值运算符,因此,一旦将Stack传输到任何会爆炸的地方,都将丢失它。 (原始实例将在与复制/移动的实例相同的指针上执行delete[]!)了解三/五/零的规则。

除此之外,它看起来像一个堆栈。

您在这里没有的问题是未定义的参考,这很有趣,因为这是您唯一询问的问题。 :)如果确实存在此类问题,则可能是您的构建系统存在问题(未能编译该源文件),我们看不到。