利用虚函数减少导出DLL的头文件依赖
概要
设想这样一个场景:我有一个类FunClass
,它的声明位于FunClass.h
,并且在FunClass.h
中,我还引用了secret.h
.
现在我需要把FunClass
导出成DLL文件供别人二次开发. 这时我需要给别人以下文件:
FunClass.h
FunClass.lib
FunClass.dll
secret.h
然而我并不想把secret.h
给别人!这个问题可以用一个虚类Fun
(名字瞎起的,不重要,Java的风格是IFunClass
,然而我们是C++) 来解决。
一个简单的例子
假设我的FunClass
有一个方法void A()
,和一个依赖secret.h
的成员Secret M
。那么虚类应当这样写(请为这个虚类新建一个头文件):
////////////////////
//// fun.h
////////////////////
// 请在导出DLL的工程里加上 FUN_EXPORT 预编译指令
#ifndef FUN_EXPORT
#define FUN_API __declspec(dllexport)
#else
#define FUN_API __declspec(dllimport)
#endif
// #include something else
// 注意头文件中没有包含 secret.h
class FUN_API Fun{
public:
Fun(){};
virtual ~Fun(){};
virtual A() = 0;
// 注意这里没有定义 Secret M
}
FUN_API Fun* createFun();
然后Fun
的实现写在Fun.cpp
中:
////////////////////
//// fun.cpp
////////////////////
#include "Fun.h"
#include "secret.h"
// #include something else
// FunClass 继承自 Fun
class FunClass : public Fun{
public:
FunClass(){};
virtual ~Fun(){};
virtual A();
private:
secret M;
}
Fun* createFun(){
return new FunClass();
};
void FunClass::A(){
// A的实现
}
好了!这样就OK了!编译之后会得到Fun.lib
和Fun.dll
,再加上Fun.h
,只需要这三个文件,就能把DLL文件用在其他工程了,下面这段代码是测试:
////////////////////
//// test.cpp
////////////////////
#include "Fun.h"
int main(){
Fun* fun = createFun(); // 虽然看起来比较奇怪,但是为了隐藏 secret.h ,忍了!
fun->A(); // fun 指向一个[FunClass类的实例](用F替代吧),
delete fun; // 由于Fun的析构函数是虚函数,所以fun在析构时会自动调用F的析构函数。
}
本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。
利用虚函数减少导出DLL的头文件依赖的更多相关文章
- C++入门经典-例8.7-多态,利用虚函数实现动态绑定
1:多态性是面向对象程序设计的一个重要特征,利用多态性可以设计和实现一个易于扩展的系统.在C++语言中,多态是指具有不同功能的函数可以用同一个函数名,这样就可以用一个函数名调用不同内容的函数,发出同样 ...
- 用javah 导出类的头文件, 常见的错误及正确的使用方法
******************************************************************************** 用javah 导出类的头文件, 常见的 ...
- [转] 关于c++的头文件依赖
http://www.cnblogs.com/yvesliao/p/3938730.html PS: 使用单向依赖 正在看google c++编程规范,里面对头文件依赖是这么说的: 1 2 3 4 5 ...
- 关于c++的头文件依赖
正在看google c++编程规范,里面对头文件依赖是这么说的: 使用前置声明(forward declarations)尽量减少.h文件中#include的数量. 当一个头文件被包含的同时也引入了一 ...
- Makefile自动生成头文件依赖
前言 Makefile自动生成头文件依赖是很常用的功能,本文的目的是想尽量详细说明其中的原理和过程. Makefile模板 首先给出一个本人在小项目中常用的Makefile模板,支持自动生成头文件依赖 ...
- Makefile中自动生成头文件依赖
为什么需要自动生成头文件依赖? 编译单个源文件时,需要获取文件中包含的头文件的信息,但是一般的Makefile不会在规则中明确写明文件依赖的头文件,所以单独修改头文件后,不会导致包含头文件的源文件重新 ...
- CPLUSPLUS 获得 一个源文件的头文件依赖。即该文件所需要的所有头文件
核心命令:gcc -M *.h.*.cpp 转: 自动处理头文件的依赖关系 http://blog.csdn.net/su_ocean16/article/details/5374696 现在我们的M ...
- C++学习之路—多态性与虚函数(一)利用虚函数实现动态多态性
(根据<C++程序设计>(谭浩强)整理,整理者:华科小涛,@http://www.cnblogs.com/hust-ghtao转载请注明) 多态性是面向对象程序设计的一个重要特征.顾名思义 ...
- Class-dump 安装和使用记录(导出应用的头文件)
class-dump算是逆向工程中一个入门级的工具,可以很方便的导出程序头文件,可以轻松的了解程序结构方便逆向.安装包下载地址:http://stevenygard.com/projects/clas ...
随机推荐
- 典型的团队VS优秀团队
如果做不了优秀的团队,那么就做一个典型的团队,公司需要这么一个神话,需要这么一个领头羊. 我在进入某公司后,第一个项目用的是"敏捷开发方法".而公司的理念恰恰是:开发.协作性强.扁 ...
- 用JSP+JavaBean开发模式实现一个销售额的查询
数据库使用mysql,如下: vo包的Sales类: package com.vo; public class Sales { public String salestime; public fl ...
- 让C#、VB.NET实现复杂的二进制操作
VB.NET和C#属于高级语言,对二进制位操作的支持不是很好,比如没有了移位运算等,用的时候确实很不方便,所以在闲暇之余我重新封装了一个用于C#.VB.NET的位操作类库,通过该类库可以实现数据移位. ...
- C++中的异常
一,异常的推演 1.函数与异常 平时我们在函数中出现异常情况时通常通过return终止函数并返回一个值,然后在函数上层来获取值并判断是什么异常情况.因为函数是栈结构的,所以return的时候是通过栈结 ...
- CMD杀进程 例如:杀8080端口的进程
首先:端口被占用的报错形式如下 说明8080端口被占用 解决方案一:查找pid,根据pid去任务管理器的进程中结束占用8080端口号的进程 1.首先按快捷键windows+R,在运行框里输入cmd,如 ...
- USACO 4.2 Drainage Ditches(网络流模板题)
Drainage DitchesHal Burch Every time it rains on Farmer John's fields, a pond forms over Bessie's fa ...
- >> 计算机的数据表示
1. 采用二进制 2. 负数采用补码表示 3. 乘法处理 4. 浮点数
- http状态码200,300,404等是什么意思
在学习网页设计的时候都应该知道状态码,但我们常见的状态码都是200,404,下面介绍其他的状态值 1开头的http状态码 表示临时响应并需要请求者继续执行操作的状态代码. 100 (继续) 请求者 ...
- C# winform调用东软动态库的问题
在C# winform程序中调用东软的动态库ESActiveX.ocx 如果是引用ESActiveX.ocx,然后在代码中设置示例,调用就会报"灾难性错误" 如果在工具箱中点击右键 ...
- pack://application:,,,/
FrameworkElementFactory gridFactory = new FrameworkElementFactory(typeof(Grid)); gridFactory.SetValu ...