如下:一个检查文件系统目录的内容的例子,使用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() 对分配的内存做了释放管理。类消亡了,内存自动释放。
所有指针管理的问题做了处理,对外的接口是类以及其成员函数。