在C ++的每个函数调用类之前运行代码

时间:2009-07-23 19:33:02

标签: c++ aop

我希望在每个函数调用一个类之前运行一些代码(可能是一个函数),以及从该类继承的类的所有函数。我想在没有实际编辑每个功能的情况下这样做,这样的事情甚至可能吗?

我会满足于将一个函数称为每个函数调用的第一条指令,而不是之前调用它。

9 个答案:

答案 0 :(得分:8)

AspectC++就是你想要的。我自己没有使用它,但是Aspect-Oriented Programming范例试图解决这个确切的问题。

答案 1 :(得分:3)

我建议使用非虚拟接口的习惯用法。所有公共功能都是非虚拟的。所有虚拟功能都受保护或私有。公共成员将调用委托给虚拟成员,通常实现为内联函数。

这是IOStream在STL中实现的方式。您可以在C++ Wikibooks了解更多相关信息。

  

意图:在一个位置对整个类层次结构的代码片段(例如,不变检查,获取/释放锁定)之前和之后进行模块化/重构。

的问候,
Ovanes

答案 2 :(得分:3)

以下可能有点矫枉过正 - 但是怎么样?

http://msdn.microsoft.com/en-us/library/c63a9b7h.aspx

答案 3 :(得分:2)

您可以考虑的另一件事是使用[boost / C ++ 0X] shared_ptr包装器,您可以在' - >'上调用自定义函数在返回类实例指针之前重载。它涉及修改使用但不修改基础类,并且我已经使用它几次来实现相同的效果。只是另一种想法。

答案 4 :(得分:1)

构建一个包装类的方法有点不方便,该类包含基类型的对象并调用周围的函数,然后调用您想要调用的函数。这可能类似于decorator

答案 5 :(得分:1)

您可以做的最好的事情是将一组虚函数声明为受保护,并让从该类继承的开发人员覆盖虚函数。基类使用的接口可以是public,它在将信息传递给受保护的虚方法之前执行所需的代码。

例如:

class Base {
  public:
    void MyMethod(void) { /* Insert code here */ YourMethod(); }
  protected:
    virtual void YourMethod(void) {}
};

如果开发人员知道他有一个特定的子类,他仍然可以通过使用dynamic_cast并使用他自己的方法集来绕过你的代码。因此,您可能希望遵循已发布的其他不涉及基本C ++语言的建议。

答案 6 :(得分:0)

这听起来像是一个分析器。您是否查看过任何分析工具的来源?

答案 7 :(得分:0)

您也可以使用Curiously recurring template pattern (CRTP)执行此操作。

答案 8 :(得分:0)

使用g++,您可以为相应的编译单元使用选项-pg,这使得编译器在每个函数的开头生成对函数mcount的调用。 mcount通常由gprof等分析工具提供,但您也可以自己实现。但是你应该确保

  • mcount具有C链接(并且不是C ++风格的名称标记),即通过将其实现为C函数并使用纯{C}之类的编译器进行编译。
  • 包含gcc的编译单元未使用mcount编译。