VS2005下的静态库制作 & 实现隐藏技术


       以前都是用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执行,就出结果了:

  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值