在C ++中为每个方法调用执行某些代码

时间:2010-03-31 12:46:54

标签: c++ methods

我有一个我想要检查的C ++类。因此,我希望所有方法在出门之前打印他们的参数和返回。

后者看起来有点容易。如果我为一切返回(),那么宏

#define return(a) cout << (a) << endl; return (a)
如果我将所有返回到括号中(或者可能被调用的任何内容),那么

会这样做(可能是错误的)。如果我想把它拿出来,只需注释掉定义。

但是,打印输入似乎更难。有没有办法,我可以使用C ++结构或workaroud黑客?

6 个答案:

答案 0 :(得分:8)

我想到了一些选择:

  • 使用调试器。
  • 使用decorator pattern,如Space_C0wb0y建议的那样。但是,这可能是很多手动输入,因为您必须复制装饰类中的所有方法并自己添加日志记录。也许您可以通过在类上运行doxygen然后解析其输出来自动创建装饰器对象...
  • 使用aspect-oriented programming。 (Logging,这是你想要做的,是AOP的常见应用。)Wikipedia lists C ++的一些AOP实现:AspectC++XWeaver和{{3} }。

答案 1 :(得分:4)

  

但是,打印输入似乎更多   难。有没有办法可以做到,   使用C ++结构或使用   workaroud hack?

没有


更新:我会在答案中失去一些简洁性,建议您可以通过应用Design by Contract来达到所需要的目标。

答案 2 :(得分:2)

听起来你想对我使用调试工具。这样您就可以看到所需的所有参数。

答案 3 :(得分:2)

如果您不介意手动插入一些代码,可以创建一个类:

  1. 将条目记录到构造函数中的方法
  2. 提供了一种转储任意参数的方法
  3. 提供记录状态的方法
  4. 使用析构函数
  5. 中的记录状态退出日志

    用法看起来像:

    unsigned long long
    factorial(unsigned long long n) {
        Inspector inspect("factorial", __FILE__, __LINE__);
        inspect.parameter("n", n);
        if (n < 2) {
            return inspect.result(1);
        }
        return inspect.result(n * fact(n-1));
    }
    

    当然,您可以编写宏来声明检查器并检查参数。如果您正在使用支持变量参数列表宏的编译器,那么您可以得到如下结果:

    unsigned long long
    factorial(unsigned long long n) {
        INJECT_INSPECTOR(n);
        if (n < 2) {
            return INSPECT_RETURN(1);
        }
        return INSPECT_RETURN(n * fact(n-1));
    }
    

    我不确定您是否可以在不使用AOP环境或某些自定义代码生成工具的情况下获得更清晰的解决方案。

答案 4 :(得分:1)

如果您的方法都是virtual,那么您可以使用decorator-pattern以非常优雅的方式实现这一目标。

编辑:从上面的评论(你想要输出统计数据)我得出结论,你绝对应该使用装饰模式。它适用于这种东西。

答案 5 :(得分:0)

我只使用日志库(或某些宏)并插入手动日志记录调用。除非你的类有过多的方法,否则开发和调试更复杂的解决方案可能会更快。