想销毁我制作的堆栈
Would like to destroy the stack that I made
所以,在class中,我们学习了一个数组抽象数据结构的实现,利用我们制作的数组class,我们实现了一个栈抽象数据结构作为一个class.
#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 class 中,我们明确使用了删除方法,但在 StackADT1 class 中我们没有这样做。
之后堆栈是否也被销毁
return 0;
叫什么?
In the ArrayADT1 class, we explicitly used the delete method, but we do no such thing in the StackADT1 class
您还在 ArrayADT1 class 中明确使用了 new 表达式,但您没有在 StackADT1 中使用 new 表达式。这是意料之中的,因为我们只删除新的内容。
//I would like to know what happens here
//dtor
析构函数的主体没有任何反应,因为主体是空的。析构函数将在(空)主体之后销毁子对象。
ArrayADT1
是可复制的,但复制它会导致未定义的行为。这是不好的。要修复它,请遵循五法则。我还建议学习 RAII 习语。示例程序在实施 RAII 时似乎是一个有缺陷的尝试。
接下来,我建议学习 std::unique_ptr
,这是管理内存的更好方法。
所以,在class中,我们学习了一个数组抽象数据结构的实现,利用我们制作的数组class,我们实现了一个栈抽象数据结构作为一个class.
#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 class 中,我们明确使用了删除方法,但在 StackADT1 class 中我们没有这样做。
之后堆栈是否也被销毁return 0;
叫什么?
In the ArrayADT1 class, we explicitly used the delete method, but we do no such thing in the StackADT1 class
您还在 ArrayADT1 class 中明确使用了 new 表达式,但您没有在 StackADT1 中使用 new 表达式。这是意料之中的,因为我们只删除新的内容。
//I would like to know what happens here //dtor
析构函数的主体没有任何反应,因为主体是空的。析构函数将在(空)主体之后销毁子对象。
ArrayADT1
是可复制的,但复制它会导致未定义的行为。这是不好的。要修复它,请遵循五法则。我还建议学习 RAII 习语。示例程序在实施 RAII 时似乎是一个有缺陷的尝试。
接下来,我建议学习 std::unique_ptr
,这是管理内存的更好方法。