【ThinkingInC++】34、带有构造函数和析构函数的Stack

头文件

/**
* 书本:【ThinkingInC++】
* 功能:带有构造函数和析构函数的Stack
* 时间:2014年8月27日11:13:10
* 作者:cutter_point
*/
#ifndef STACK3_H_INCLUDED
#define STACK3_H_INCLUDED

class Stack
{
    struct Link
    {
        void* data;
        Link* next;
        Link(void* dat, Link* nxt);
        ~Link();
    }*head;
public:
    Stack();
    ~Stack();
    void push(void* dat);   //压入一个数据
    void* peek();   //返回栈的顶元素但是在栈中不删除元素
    void* pop();    //返回栈顶元素,并且从栈中删除这个元素
};

#endif // STACK3_H_INCLUDED

定义文件

/**
* 书本:【ThinkingInC++】
* 功能:关于Stack的够着函数
* 时间:2014年8月27日11:13:14
* 作者:cutter_point
*/

#include"Stack3.h"
#include"../require.h"

using namespace std;

/*
    struct Link
    {
        void* data;
        Link* next;
        Link(void* dat, Link* nxt);
        ~Link();
    }*head;
public:
    Stack();
    ~Stack();
    void push(void* dat);   //压入一个数据
    void* peek();   //返回栈的顶元素但是在栈中不删除元素
    void* pop();    //返回栈顶元素,并且从栈中删除这个元素
*/
Stack::Link::Link(void* dat, Link* nxt)
{
    data=dat;
    next=nxt;
}

//        ~Link();
Stack::Link::~Link()
{
}

//    Stack();
Stack::Stack()
{
    head=nullptr;
}

//    ~Stack();
Stack::~Stack()
{
    require(head == nullptr, "Stack not empty");
}

//    void push(void* dat);   //压入一个数据
void Stack::push(void* dat)
{
    head=new Link(dat, head);   //创建一个新节点,然后把原来的节点重新赋值给老节点
}

//    void* peek();   //返回栈的顶元素但是在栈中不删除元素
void* Stack::peek()
{
    require(head != nullptr, "Stack empty");
    return head->data;
}

//    void* pop();    //返回栈顶元素,并且从栈中删除这个元素
void* Stack::pop()
{
    if(head == nullptr)
        return 0;
    void* result=head->data;
    Link* oldHead=head;
    head=head->next;
    delete oldHead; //去除元素,回收内存空间
    return result;
}

/*
Link和Stack仅仅存放指针,但他们不负责清除这些指针
要知道由谁来清除这个对象,对于一个程序是成功还是失败来说是很关键的--这就是为什么
如果Stack对象销毁时不为空,Stack::~Stack()就会打印出错误信息的原因
*/

测试文件

/**
* 书本:【ThinkingInC++】
* 功能:测试程序的使用
* 时间:2014年8月27日11:13:20
* 作者:cutter_point
*/

#include"Stack3.cpp"
#include"../require.h"
#include<fstream>
#include<iostream>
#include<string>

using namespace std;

int main()
{
    ifstream in("Stack3Test.cpp");
    assure(in, "Stack3Test.cpp");
    Stack textlines;
    string line;

    while(getline(in, line))
        textlines.push(new string(line));   //压栈,倒序输出

    string* s;
    while((s=(string*)textlines.pop()) != 0)
    {
        cout<<*s<<endl;
        delete s;
    }

    return 0;
}

最近想了想是不是要恢复的以前的吧那些理论的东西也写进来呢?因为我们查博客的时候,但看程序的话,有些地方还是不懂的,虽然我写了大量的注释,但是感觉还是要有个层次性的东西。

时间: 2024-10-31 09:54:34

【ThinkingInC++】34、带有构造函数和析构函数的Stack的相关文章

【ThinkingInC++】53、构造函数,析构函数,全局变量

/** * 书本:[ThinkingInC++] * 功能:构造函数,析构函数,全局变量 * 时间:2014年9月17日18:07:43 * 作者:cutter_point */ #include <fstream> using namespace std; ofstream out("statdest.txt"); class Obj { char c; public: Obj(char cc) : c(cc) {out<<"Obj::Obj() f

【ThinkingInC++】33、构造函数和析构函数的各种特征

/** * 书本:[ThinkingInC++] * 功能:构造函数和析构函数的各种特征 * 时间:2014年8月26日08:50:52 * 作者:cutter_point */ /* 构造函数和析构函数是没有返回值的. 析构函数:当对象超出他的作用域的时候,编译器将自动调用析构函数,但析构函数调用的 唯一证据是包含该对象的右括号,而且即使使用goto语句跳转析构函数任然被调用 */ #include<iostream> using namespace std; class Tree { in

C++:派生类的构造函数和析构函数的调用顺序

一.派生类 在C++编程中,我们在编写一个基类的派生类时,大致可以分为四步: ? 吸收基类的成员:不论是数据成员还是函数成员,派生类吸收除基类的构造函数和析构函数之外的全部成员. ? 改造基类函数:在派生类中声明一个或多个与其(某个)基类中的成员函数同名的成员函数,并将它(们)根据新的需求进行重写 ? 发展新的成员:在派生类中添加新的成员变量和成员函数,其中新添加的成员要求必须和基类中的成员不同名,并且应当保证新添加的成员会使派生类在功能上相比其基类有所发展 ? 重写派生类的构造函数和析构函数

学习C++ -&gt; 构造函数与析构函数

学习C++ -> 构造函数与析构函数 一.构造函数的介绍    1. 构造函数的作用        构造函数主要用来在创建对象时完成对对象属性的一些初始化等操作, 当创建对象时, 对象会自动调用它的构造函数.一般来说, 构造函数有以下三个方面的作用:            ■ 给创建的对象建立一个标识符;            ■ 为对象数据成员开辟内存空间;            ■ 完成对象数据成员的初始化.            2. 默认构造函数        当用户没有显式的去定义构造

构造函数和析构函数中得异常处理

一. 构造函数 总结如下: 1. 构造函数中抛出异常,会导致析构函数不能被调用,但对象本身已申请到的内存资源会被系统释放(已申请到资源的内部成员变量会被系统依次逆序调用其析构函数). 2. 因为析构函数不能被调用,所以可能会造成内存泄露或系统资源未被释放. 3. 构造函数中可以抛出异常,但必须保证在构造函数抛出异常之前,把系统资源释放掉,防止内存泄露.(如何保证???使用auto_ptr???) 试验代码: 1 //ExceptionConstructor.h 2 #pragma once 3

C++C++中构造函数与析构函数的调用顺序

http://blog.csdn.net/xw13106209/article/details/6899370 1.参考文献 参考1: C++继承中构造函数.析构函数调用顺序及虚函数的动态绑定 参考2: 构造函数.拷贝构造函数和析构函数的的调用时刻及调用顺序 参考3: C++构造函数与析构函数的调用顺序 2.构造函数.析构函数与拷贝构造函数介绍 2.1构造函数 构造函数不能有返回值 缺省构造函数时,系统将自动调用该缺省构造函数初始化对象,缺省构造函数会将所有数据成员都初始化为零或空 创建一个对象

C++:派生类的构造函数和析构函数

4.2 派生类的构造函数和析构函数4.2.1 派生类构造函数和析构函数的执行顺序 通常情况下,当创建派生类对象时,首先执行基类的构造函数,随后再执行派生类的构造函数:当撤销派生类对象时,则先执行派生类的派生类的析构函数,随后再执行基类的析构函数. //例4.5 派生类的构造函数和析构函的执行顺序 #include<iostream> using namespace std; class Base{ //声明基类Base public: Base() { cout<<"Co

关于C++类中的土著民:构造函数,复制构造函数,析构函数

我们初学C++时可能会对类的构造函数,复制构造函数,析构函数有点疑问.整理如下(个人见解,如有错误,还望指正.): 1.构造函数 根据构造函数的定义知它的作用是初始化类的数据成员或内嵌类的对象,所以它的参数表就应该是它要初始化的对象类型.构造函数分三类:默认构造函数.构造函数.委托构造函数. 默认构造函数 默认构造函数没有返回值,没有参数表,没有函数体,如果类内没有显式的定义构造函数,系统会自动生成默认构造函数,如果已经定义了构造函数,但仍需要默认构造函数,可以在默认构造函数参数表后加defau

C++文件头,命名空间,new和delete,内联函数,引用,函数重载,构造函数和析构函数,深拷贝和浅拷贝,explict,this指针

 目  录 1       开始学习C++.............................................................................................................. 4 1.1       C++的头文件.................................................................................................