首页 > 解决方案 > 想破坏我做的堆栈

问题描述

所以,在课堂上,我们了解了数组抽象数据结构的实现,并使用我们制作的数组类,将堆栈抽象数据结构作为一个类来实现。

#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;

叫做?

标签: c++classdestructorabstract-data-type

解决方案


在 ArrayADT1 类中,我们显式使用了 delete 方法,但在 StackADT1 类中我们没有这样做

您还在 ArrayADT1 类中显式使用了新表达式,但没有在 StackADT1 中使用新表达式。这是意料之中的,因为我们只删除了新的内容。

//I would like to know what happens here
//dtor

该析构函数的主体中什么也没有发生,因为主体是空的。析构函数将销毁(空)主体之后的子对象。


ArrayADT1是可复制的,但复制它会导致未定义的行为。这是不好的。要解决它,请遵循五规则。我还建议学习 RAII 成语。示例程序似乎是实施 RAII 的一个有缺陷的尝试。

接下来,我建议了解std::unique_ptr哪种方式管理内存更好。


推荐阅读