我想问两个有关此代码的问题。在这里,我只是尝试模拟堆栈。
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;
}
答案 0 :(得分:5)
这有几个问题。
动态分配或以其他方式分配的数组不是堆栈/队列/向量。您正在创建0个int
。之后,所有元素访问都具有未定义的行为。您需要数组增长,即成为向量,例如std::vector
。
delete[] &stackdata
的间接级别错误。您的意思是delete[] stackdata
。您正在尝试删除未动态分配的指针。
您缺少复制/移动构造函数和复制/移动赋值运算符,因此,一旦将Stack
传输到任何会爆炸的地方,都将丢失它。 (原始实例将在与复制/移动的实例相同的指针上执行delete[]
!)了解三/五/零的规则。
除此之外,它看起来像一个堆栈。
您在这里没有的问题是未定义的参考,这很有趣,因为这是您唯一询问的问题。 :)如果确实存在此类问题,则可能是您的构建系统存在问题(未能编译该源文件),我们看不到。