我想问两个关于此代码的问题。我只是在尝试模拟堆栈。
堆栈
#pragma once
namespace stackandqueue {
class Stack
{
private:
int index;
int *stackdata;
public:
Stack();
~Stack();
void push(int val);
int pop();
int top();
bool isEmpty();
};
}
Run Code Online (Sandbox Code Playgroud)
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;
}
}
Run Code Online (Sandbox Code Playgroud)
意思是让我创造
Stack stack;
Run Code Online (Sandbox Code Playgroud)
然后它初始化一个动态数组,该数组的第一个索引为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;
}
Run Code Online (Sandbox Code Playgroud)
这有几个问题。
动态分配或以其他方式分配的数组不是堆栈/队列/向量。您实际上是在创建0 ints。之后,所有元素访问都具有未定义的行为。您需要数组才能增长,即成为一个向量,例如std::vector。
delete[] &stackdata间接级别错误。你是说delete[] stackdata。您试图删除未动态分配的指针。
您缺少复制/移动构造函数和复制/移动赋值运算符,因此一旦将其传输到Stack任何地方,它都会爆炸。(原始实例将delete[]在与复制/移动的实例相同的指针上执行!)了解三/五/零的规则。
除此之外,它看起来像一个堆栈。
您这里没有的问题是未定义的参考,这很有趣,因为这是您唯一提出的问题。:)如果确实存在此类问题,则可能是您的构建系统存在问题(未能编译该源文件),这是我们看不到的。