【发布时间】:2021-11-03 11:36:10
【问题描述】:
所以,在课堂上,我们了解了数组抽象数据结构的实现,并使用我们制作的数组类,将堆栈抽象数据结构实现为一个类。
#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;
被调用?
【问题讨论】:
-
将
new与delete配对,StackADT1不使用new所以它也不需要调用delete -
令人耳目一新的内存管理并没有完全错误。你的代码是一个很好的例子,它将内存管理分离到一个除了这个之外什么都不做的类中,实际的堆栈类不需要担心手动搞乱
new或delete -
ArrayADT1应该实现五规则,之后Stack将免费获得其所有功能。还可以考虑使用一个参数明确的 ctors。 -
免费的代码审查godbolt.org/z/Ta96xhf3K
标签: c++ class destructor abstract-data-type