C++沉思录笔记 —— 第二十四章:一个库接口设计实例

如下:一个检查文件系统目录的内容的例子,使用C语言、C库。

#include <stdio.h>

#include <dirent.h>

int main(int argc, char const *argv[])

{

    DIR* dp = opendir(".");

    struct dirent* d;

    while(d = readdir(dp))

        printf("%s\n", d->d_name);

    closedir(dp);

    return 0;

}

此段代码的好处与坏处都在于指针。代码简洁优美,适合阅读,但存在安全隐患。空指针如何处理?库分配的内存块(指针指向)何时释放?

#include <iostream>

#include <dirent.h>

using namespace std;

class Dir_offset{

    friend class Dir;

private:

    long l;

    Dir_offset(long n) { l = n; }

    long tell_dir() { return l; }

};

class Dir{

public:

    Dir(const char*);

    ~Dir();

    int read(dirent&);

    void seek(Dir_offset);

    Dir_offset tell() const;

private:

    DIR* dp;

    Dir(const Dir&);

    Dir& operator=(const Dir&);

};

Dir::Dir(const char* file): dp(opendir(file)) {}

Dir::~Dir(){

    if(dp)

        closedir(dp);

}

void Dir::seek(Dir_offset pos){

    long l = pos.tell_dir();

    if(dp)

        seekdir(dp, l);

}

Dir_offset Dir::tell() const{

    if(dp)

        return telldir(dp);

    return -1;

}

int Dir::read(dirent& d){

    if(dp){

        dirent* r = readdir(dp);

        if(r){

            d = *r;

            return 1;

        }

    }

    throw("dirent isn't exist.\n");

    return 0;

}

int main(int argc, char const *argv[])

{

    Dir dp("C:\\");

    dirent d;

    

    try{

        while(dp.read(d))

            cout << d.d_name <<endl;

    }catch (const char* msg){

        cerr << msg << endl;

    }

    

    return 0;

}

此段代码main函数同样简洁优美,适合阅读。更重要的是接口设计被优化了。

Dir dp("C:\\"); ---- 对象被创建,但是DIR* dp是对象的私有数据,被隐藏管理了,无法直接访问,这就是C++对指针的管理。

~Dir() 对分配的内存做了释放管理。类消亡了,内存自动释放。

所有指针管理的问题做了处理,对外的接口是类以及其成员函数。

 

猜你喜欢

转载自www.cnblogs.com/vonyoven/p/11829136.html