c++ - 想破坏我做的堆栈
问题描述
所以,在课堂上,我们了解了数组抽象数据结构的实现,并使用我们制作的数组类,将堆栈抽象数据结构作为一个类来实现。
#include <iostream>
#ifndef ARRAYADT1_H
#define ARRAYADT1_H
using namespace std;
class ArrayADT1
{
public:
ArrayADT1();
ArrayADT1(int);
virtual ~ArrayADT1();
bool setElement(int, int);
int getElement(int);
int getCapacity();
protected:
private:
int capacity;
int* elements;
};
#endif // ARRAYADT1_H
ArrayADT1::ArrayADT1(){
capacity=0;
elements=NULL;
}
ArrayADT1::ArrayADT1(int arraySize){
capacity=arraySize;
elements=new int[arraySize];
}
bool ArrayADT1::setElement(int index, int value){
elements[index]=value;
return(true);
}
int ArrayADT1::getElement(int index){
return(elements[index]);
}
int ArrayADT1::getCapacity(){
return(capacity);
}
ArrayADT1::~ArrayADT1(){
delete[] elements;
}
#ifndef STACKADT1_H
#define STACKADT1_H
using namespace std;
class StackADT1
{
public:
StackADT1()=delete; //disable creation of stack without specifying capacity
StackADT1(int); //create stack of capacity
bool push(int);
int pop();
bool isFull();
bool isEmpty();
int length();
virtual ~StackADT1();
protected:
private:
int ValueCount;
ArrayADT1 members;
};
#endif // STACKADT1_H
#include <iostream>
StackADT1::StackADT1(int stackCapacity): members(stackCapacity){
ValueCount=0;
}
int StackADT1::length(){
return(ValueCount);
}
bool StackADT1::isEmpty(){
if(ValueCount==0)
return(true);
return(false);
}
bool StackADT1::isFull(){
if(ValueCount==members.getCapacity())
return(true);
return(false);
}
int StackADT1::pop(){
if(isEmpty()){
cout<<"The Stack is empty"<<"\n";
return(-1);
}
ValueCount--;
return(members.getElement(ValueCount));
}
bool StackADT1::push(int value){
if(isFull()){
cout<<"The stack is full"<<"\n";
return(false);
}
members.setElement(ValueCount, value);
ValueCount++;
return(true);
}
StackADT1::~StackADT1(){
//I would like to know what happens here
//dtor
}
我想知道这两种情况下的析构函数。在 ArrayADT1 类中,我们显式使用了 delete 方法,但在 StackADT1 类中我们没有这样做。堆栈是否也会在之后被销毁
return 0;
叫做?
解决方案
在 ArrayADT1 类中,我们显式使用了 delete 方法,但在 StackADT1 类中我们没有这样做
您还在 ArrayADT1 类中显式使用了新表达式,但没有在 StackADT1 中使用新表达式。这是意料之中的,因为我们只删除了新的内容。
//I would like to know what happens here //dtor
该析构函数的主体中什么也没有发生,因为主体是空的。析构函数将销毁(空)主体之后的子对象。
ArrayADT1
是可复制的,但复制它会导致未定义的行为。这是不好的。要解决它,请遵循五规则。我还建议学习 RAII 成语。示例程序似乎是实施 RAII 的一个有缺陷的尝试。
接下来,我建议了解std::unique_ptr
哪种方式管理内存更好。
推荐阅读
- java - 从数据库读取文件内容
- javascript - 通过前端 javascript 列出服务器上的文件
- javascript - 重新加载时删除 jQuery
- jquery - 在 jQuery 中使用 .each() 设置元素的显示
- excel - Excel VBA 将工作簿作为单独的文档发送
- javascript - 将字符串格式日期从 html 发送到 javascript 函数。Javascript 只收到不同的年份
- docker - 如何使用卷更新和同步 Docker 容器文件
- php - Join between two table don't return rows with no link between the tables
- excel - 如何将数组和单个单元格作为参数传递
- ruby-on-rails - 成功构建但进程以状态 1 退出,在 heroku 上部署 rails 应用程序