STL容器类的继承
即时创建一个元素序列的能力是惊人的,它实现了你过去可能会花费(或者更确切的是浪费)多少时间才能解决这个特定的问题。例如,许多实用程序都涉及将文件读到内存,修改文件然后将它写会磁盘。你也可以抽取StringVector.cpp文件中的功能封装成一个以后可重用类。
现在问题是:创建一个vector类型成员的成员对象还是继承一个呢?一般的准则是使用组件(成员对象)而不是继承,但是对于STL这却经常不成立,因为如此多的现存算法都能与STL类型一起工作以至于你可能想要你的新类型也是一个STL类型。因此字符串链表(list)也应该是一个vector,这样就需要继承。
// File editor tool
#ifndef FILEEDITOR_H
#define FILEEDITOR_H
#include <iostream>
#include <string>
#include <vector>
class FileEditor :public std::vector<std::string>
{
public:
void open(const char* filename);
FileEditor(const char* filename) { open(filename); }
FileEditor() {};
void write(std::ostream& out = std::cout);
}; #endif // FILEEDITOR_H ///:~
注意在这要小心的避免使用using namespace std 语句,以防止每个包含这个头文件的文件都打开std名称空间。构造函数打开文件,读到FileEditor中,write()函数将字符串vector放入任何输出流中(ostream
)。注意在write()函数中有一个默认的参数可以参考。
实现十分简单:
#include "FileEditor.h"
#include <fstream>
#include "../require.h"
using namespace std;
void FileEditor::open(const char* filename)
{
ifstream in(filename);
assure(in, filename);
string line;
while(getline(in, line)) push_back(line);
}
// Could also use copy() here:
void FileEditor::write(ostream& out)
{
for(iterator w = begin(); w != end(); w++) out << *w << endl;
} ///:~
来自StringVector.cpp中的函数都被简单的再封装。通过开发一个程序来解决一个特定的应用问题然后在成序中发现了能够被转换成一个类的通用功能,这是类开发的一种常用的方法。
使用FileEdito的寥寥几行程序:
//{L} FileEditor
// Test the FileEditor tool
#include <sstream>
#include "FileEditor.h"
#include "../require.h"
using namespace std;
int main(int argc, char* argv[])
{
FileEditor file;
if(argc > 1)
FileEditor file;
if(argc > 1)
{
file.open(argv[1]);
}
file.open(argv[1]);
}
else
{
file.open("FEditTest.cpp");
}
// Do something to the lines...
int i = 1;
FileEditor::iterator w = file.begin();
while(w != file.end())
file.open("FEditTest.cpp");
}
// Do something to the lines...
int i = 1;
FileEditor::iterator w = file.begin();
while(w != file.end())
{
ostringstream ss;
ss << i++;
*w = ss.str() + ": " + *w;
w++;
}
// Now send them to cout:
file.write();
ostringstream ss;
ss << i++;
*w = ss.str() + ": " + *w;
w++;
}
// Now send them to cout:
file.write();
} ///:~ Now the operation of reading the file is in the constructor:
FileEditor file(argv[1]);
( (或者在open()成员函数),写只要一行(默认的是发送至cout输出流)
file.write()
程序的主要部分是在内存中文件实际的修改部分。