以前都是用VC6.0的,转到VS2005以后颇不习惯。不过制作静态库的过程似乎简单了些。先是看到一篇讲如何实现接口与实现的分离的文章,地址忘记了,主要就是讲如何把自己的实现隐藏起来,另外也可以做到修改后不用重复编译。忽然想起前两天看的设计模式,有些启发。C++是面向对象的语言,类与类之间的关系用得好,绝对可以做出美妙的设计。
先来看如何隐藏。其实很简单,Imp类是实现类,用来干具体的工作,现在我需要发布了,实现的接口是print函数,但是里面调用了两个private的函数,里面也有private的成员变量,我当然不希望讲头文件发布出去,让用户看到这些。所以,直接做成静态库+头文件的方案就pass了。现在就再定义一个类,给Imp类做一下包装。
先看Imp类:
Imp.h
class Imp{
public:
Imp(int a=1,int b=2);
~Imp();
void print();
private:
int a;
int b;
void printA();
void printB();
void printS();
};
Imp.cpp
#include <iostream>
using namespace std;
#include "Imp.h"
Imp::Imp(int a,int b)
{
cout<<"construction of Imp"<<endl;
this->a=a;
this->b=b;
}
Imp::~Imp()
{
cout<<"deconstruction of Imp"<<endl;
}
void Imp::printA()
{
cout<<"a= "<<a<<endl;
}
void Imp::printB()
{
cout<<"b= "<<b<<endl;
}
void Imp::print()
{
printA();
printB();
printS();
}
void Imp::printS()
{
cout<<"a+b= "<<a+b<<endl;
}
接口的类是interf:
class Imp;
class interf{
public:
interf();
~interf();
void print();
private:
Imp *_imp;
};
接口类的实现:
#include <iostream>
using namespace std;
#include "interf.h"
#include "Imp.h"
interf::interf()
{
cout<<"construction of interf"<<endl;
_imp = new Imp();
}
interf::~interf()
{
if (_imp != NULL)
{
delete _imp;
_imp = NULL;
}
cout<<"deconstruction of interf"<<endl;
}
void interf::print()
{
_imp->print();
}
方法其实很简单,就是套了一个类,interf类包含Imp类的一个指针。构造和析构小心处理,防止内存泄露。然后声明一个public的print函数,作为用户使用的接口函数,这个函数的实现,就简单的调用Imp指针对象的print函数就行了。用户只知道interf有一个Imp指针对象,却不知道实现的细节。
主函数:
#include "interf.h"
int main()
{
interf *_int = new interf;
_int->print();
delete _int;
return 0;
}
这样就搞定了。现在要做测试,假如我是用户,我显然不能拥有这些源代码。所以,应生成lib文件。右键工程名,属性,配置属性,常规,配置类型-->静态库。然后把main.cpp删掉,再按F7编译,就生成了test.lib。
现在新建一个测试工程tc, 代码如下:
#include "interf.h"
int main()
{
interf inter;
inter.print();
return 0;
}
将interf.h和test.lib拷过来,包含头文件interf.h,然后右键工程名,属性,配置属性,链接器,输入,附加依赖项,写上test.lib。然后按F7编译,ctrl+F5执行,就出结果了: