AOP是近年炒得很热,但却用得很少的一门技术,不过这并不能阻止我去学习它。既然能一度炒得火热,必定有过人之处。说AOP是一种思想或许更适合一些,它并不描述哪一种专有的技术,也不指定实现方式。
众所周知,C++没有丰富的动态类型信息,更没有动态生成类的功能(C++类型在编译后就基本上没有类型存在了),所以无法像java一样采用动态代理来实现AOP。
Aspect C++是C++的一个AOP实现,它使用了插入代码的方法。
一个典型的Aspect C++示例需要一个C++源文件(.cpp)、一个Aspect C++源文件(.ah),通过ac++编译器把C++源文件和Aspect C++源文件转换成混合的C++源文件(如果有头文件也会转换),最后通过普通的C++编译器编译出可执行文件。
下面是一个简单的示例:
1、C++源文件:
#include <stdio.h>
class A {
public:
int a(int i, float b);
};
int A::a(int i, float b) {
printf("inside A::a(%d, %f)\n", i, b);
return i;
}
void b(char c, char *str) {
printf("inside b(%c, %s)\n", c, str);
}
int main() {
A a;
a.a(4711, 3.14);
b('H', "ello World");
return 0;
}
2、Aspect C++源文件:
#include <stdio.h>
aspect Action {
advice execution("% A::%()") || execution("% b()") : around() {
printf("A: before(exec) %s\n", JoinPoint::signature());
printf("that : %p\n" , tjp->that());
printf("target: %p\n" ,tjp->target());
tjp->proceed();
printf("A: after(exec) %s\n", JoinPoint::signature());
}
advice call("% A::%()") || call("% b()") : around() {
printf("A: before(call) %s\n", JoinPoint::signature());
printf("that : %p\n" , tjp->that());
printf("target: %p\n" ,tjp->target());
tjp->proceed();
printf("A: after(call) %s\n", JoinPoint::signature());
}
};
aspect ActionB {
advice execution("% A::%()") || execution("% b()") : around() {
printf("B: before(exec) %s\n", JoinPoint::signature());
printf("that : %p\n" , tjp->that());
printf("target: %p\n" ,tjp->target());
tjp->proceed();
printf("B: after(exec) %s\n", JoinPoint::signature());
}
advice call("% A::%()") || call("% b()") : around() {
printf("B: before(call) %s\n", JoinPoint::signature());
printf("that : %p\n" , tjp->that());
printf("target: %p\n" ,tjp->target());
tjp->proceed();
printf("B: after(call) %s\n", JoinPoint::signature());
}
};
简单说明一下:
1、“aspect Action”定义了一个“方面”,名字是“Action”,定义一个方面可以理解为“我关注程序的这个方面”。
2、“advice 切入点:位置”定义一个“处理方法”,在切入点的指定位置上执行代码。切入点可以选择call、execution、construction、destruction,分别表示调用、执行、构造函数、析构函数。执行点可以选择before、after、around,分别表示在这些切入点的前面、后面或替换掉整个函数。
3、tpj表示thisJoinPoint,表示切入点本身。上面的例子由于使用around替换了整个执行过程,所以要执行原来的操作还需要调用tpj->proceed()。这里的around完成的功能可由一个before和一个after代替
4、切入点的匹配模式。切入点通过字符串来匹配要切入的操作,“%”字符表示匹配任意类型(或名字),在AspectJ中,这个字符是“*”,由于C++中“*”用来定义指针,所以在Aspect C++中用“%”;“...”用来匹配任意个参数。
编译:
首先运行ac++ -p <你的源文件所在目录> -d <输出文件目录> -I<附加头文件目录>,这一步会转换C++源文件和Aspect C++源文件。
如果在安装了VC,编译时可指定INCLUDE路径及_WIN32宏。
ac++ -p <你的源文件所在目录> -d <输出文件目录> -I<附加头文件目录> -I"C:\Program Files\Microsoft Visual Studio 8\VC\include" -D_WIN32
然后直接编译:
cl <源文件名>.cc
上面这个程序在处理前运行结果如下:
F:\soft\ac\examples\Action>main
inside A::a(4711, 3.140000)
inside b(H, ello World)
经Aspect C++处理后运行结果:
F:\soft\ac\examples\Action-out>main
A: before(call) int A::a(int,float)
that : 00000000
target: 0012FF73
B: before(call) int A::a(int,float)
that : 00000000
target: 0012FF73
A: before(exec) int A::a(int,float)
that : 0012FF73
target: 0012FF73
B: before(exec) int A::a(int,float)
that : 0012FF73
target: 0012FF73
inside A::a(4711, 3.140000)
B: after(exec) int A::a(int,float)
A: after(exec) int A::a(int,float)
B: after(call) int A::a(int,float)
A: after(call) int A::a(int,float)
A: before(call) void b(char,char *)
that : 00000000
target: 00000000
B: before(call) void b(char,char *)
that : 00000000
target: 00000000
A: before(exec) void b(char,char *)
that : 00000000
target: 00000000
B: before(exec) void b(char,char *)
that : 00000000
target: 00000000
inside b(H, ello World)
B: after(exec) void b(char,char *)
A: after(exec) void b(char,char *)
B: after(call) void b(char,char *)
A: after(call) void b(char,char *)
相关推荐
C++中的AOP理论探讨了如何在C++平台上实现面向切面编程,其中横切关注点是指影响多个类的那些关注点,例如日志记录、安全性、事务管理等。 在C++中,要实现AOP,需要利用语言提供的特性来模拟AOP的概念。C++中没有...
### 在C++中运用AOP #### 一、引言 面向切面编程(Aspect-Oriented Programming,简称AOP)是一种编程范式,旨在提高软件模块化程度,特别是通过将那些横切关注点(Cross-cutting Concerns)从应用程序的主要逻辑...
面向横截面编程面向横截面编程面向横截面编程面向横截面编程面向横截面编程
本教程介绍 AOP 及其基本概念。AOP 及其相关的工具使您可以将基本横切关注点(如日志记录和安全)的代码,与程序的核心应用逻辑相分离。AOP 通过使代码更具有可读性、更不容易出错以及更容易设计和维护,改善了代码...
知识点:面向切面编程(Aspect-Oriented Programming, AOP)与C++及Aspect C++ 在IT领域,尤其是软件工程和编程语言设计方面,面向切面编程(Aspect-Oriented Programming,简称AOP)是一种重要的编程范式,旨在...
在本主题中,“基于AOP技术的应用层C++进程恢复”探讨了如何利用AOP在C++应用程序中实现检查点和恢复功能,以确保进程的稳定性和可靠性。 在C++中,传统的编程方式往往难以有效地处理非功能性需求,如日志记录、...
C++11是C++的一个重要版本,它引入了许多新特性,包括lambda表达式、右值引用、类型推断(auto关键字)以及更强大的模板元编程等,这些特性使得在C++中实现AOP变得更加便捷和高效。 C++11的lambda表达式可以用于...
搜集了 万方数据库 相关论文 期刊 以及网上 这方面几乎所有网页 都是自己学习之后留下来的 免去了大家搜集资料整理的麻烦 万方账号还是找别人借的~~~ 网上这方面 特别是c++可谓少之又少 搜集不容易 所以资源分高些 ...
### 面向方面编程(AOP)详解 #### AOP概述 面向方面编程(Aspect Oriented Programming,简称AOP)是一种程序设计范式,它作为面向对象编程(Object-Oriented Programming,简称OOP)的补充和发展。AOP的核心理念...
6. 面向切面编程:虽然C++本身并不直接支持面向切面编程(AOP),但可以通过预处理器宏和元编程等技术实现类似的功能。这部分内容可能在某个文件中有所提及,例如C++(day13).txt。 四、实战篇 7. 文件I/O:C++提供了...
【TinyC++软件资料包】是一个专为中小学生设计的C/C++编程学习工具,它集成了集成开发环境(IDE)的功能,旨在简化编程初学者的学习曲线。作为一个小巧且用户友好的IDE,TinyC++不仅提供了代码编辑器,还支持编译、...
9. 面向切面编程(AOP):虽然C++本身不直接支持AOP,但可以通过预处理器宏、元编程或第三方库实现类似功能。 10. 并发和并行编程:C++11及后续版本引入了线程库,使得并发编程更为方便,同时提供了原子操作、互斥...
19. **面向切面编程(AOP)**:虽然C++本身不直接支持AOP,但通过第三方库可以实现类似功能。 20. **单元测试**:介绍如何编写和执行单元测试,以确保代码质量。 21. **代码风格与注释**:良好的编码规范和注释...
2009福富笔试题(java,c/c++)海外,电信 以下是从给定的文件信息中生成的相关知识点: 1. 复习要点1.jsp 基础(转向,9 大对象) 知识点:jsp 基础、服务器端编程、Java Web 开发 解释:jsp 是一种服务器端编程语言...
在C++中实现AOP虽然不如某些其他语言(如Java的AspectJ)直接,但可以通过一些库和技巧,如预处理器宏、模板元编程等来模拟AOP的概念。这允许开发者以面向方面的思维方式来组织代码,提升代码质量和可重用性。 总之...
10. **Spring框架**:掌握依赖注入(DI)和控制反转(IoC),以及AOP的概念。 **C面试知识点:** 1. **基本语法**:理解指针、数组、结构体、联合体等核心概念。 2. **内存管理**:手动内存分配(malloc/free)和...
与C++、Java等语言相比,JavaScript独特的OOP编程规则使用步骤较为繁琐、不容易掌握,这不但影响JavaScript开发的效率,也增加了开发的难度。 为了解决JavaScript OOP编程规则的复杂性,本文对JavaScript OOP编程...
7. Spring框架:了解Spring的核心特性,如依赖注入、AOP、事务管理,以及Spring Boot和Spring Cloud的相关知识。 8. 测试:掌握JUnit和Mockito等测试工具,理解单元测试和集成测试的重要性。 【C++编程】 C++作为...
LLVM 设计之初就考虑到了多阶段优化的能力,它可以在编译的不同阶段对代码进行各种优化操作,同时它也支持多种编程语言,包括 C、C++、Java 等。这使得LLVM成为了实现多语言运行时AOP系统的良好候选。 基于以上描述...
然而,在多数编程语言,例如Matlab和C/C++中,反正切函数的返回值通常限定在[-π/2, π/2]区间内。这就导致了直接使用编程语言中的反正切函数计算AoP时会出现不精确的问题。 为了克服这一问题,本文提出了一种基于...