C++如何达到此代码中的'stack'行为?

C++ how to reach 'stack' behaviour in this code?

本文关键字:stack 行为 何达 代码 C++      更新时间:2023-10-16

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

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作为第一个索引来启动一个动态数组,然后我按下,pop,top值。

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

第二个问题:关于" stackdata",如果我想声明具有动态大小的"数组",您会发现正确的方法吗?

我愿意改善和最佳实践。我习惯编程语言,但我从未研究过C ,我不想做不好的做法。所以你看到我从一开始就拿走了。

谢谢。


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

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 int s。之后,您的所有元素都具有不确定的行为。您需要您的数组 grow ,即成为向量,例如std::vector

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

  3. 您缺少复制/移动构造函数,并复制/移动分配运算符,因此,一旦将Stack运输到任何地方,它将爆炸。(原始实例将对复制/移动实例的同一指针进行delete[]!)阅读有关三/五/零的规则。

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

您的问题 在这里是一个未定义的参考,这很有趣,因为那是您唯一问的一个参考。:)如果您确实确实有这样的事情,那么您的构建系统可能是一个问题(无法编译该源文件),我们看不到。