代码之家  ›  专栏  ›  技术社区  ›  Luís Guilherme

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

  •  7
  • Luís Guilherme  · 技术社区  · 16 年前

    我有一个C++类,我想检查一下。所以,我希望所有的方法都在出来之前打印它们的参数和返回。

    后者看起来有些简单。如果我对所有内容都返回(),则返回一个宏

    #define return(a) cout << (a) << endl; return (a)
    

    如果我把所有返回值都用圆括号括起来(或者不管这叫什么),就会这样做(可能是错误的)。如果我想去掉这个,只要注释掉定义。

    然而,打印输入似乎更困难。有没有办法,我可以用C++结构或者用WorkAdHAG?

    6 回复  |  直到 16 年前
        1
  •  4
  •   Community Mohan Dere    9 年前

    然而,打印输入似乎更多 很难。我有办法吗? 使用C++结构或用 权宜之计?

    不。


    更新: 我会在我的回答中失去一些简洁性,因为我建议你可以通过应用 Design by Contract .

        2
  •  8
  •   albert    7 年前

    我想到了几个选择:

        3
  •  2
  •   Seth M.    16 年前

    听起来你想用一个调试工具。这将允许您查看所需的所有参数。

        4
  •  2
  •   D.Shawley    16 年前

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

    1. 在构造函数中记录方法的条目
    2. 提供转储任意参数的方法
    3. 提供记录状态的方法
    4. 日志以析构函数中记录的状态退出

    用法如下:

    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 环境或一些自定义代码生成工具。

        5
  •  1
  •   Björn Pollex    16 年前

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

    编辑: 从您上面的评论(您想要统计数据的输出)中,我得出结论,您一定应该使用decorator模式。它是为这种东西设计的。

        6
  •  0
  •   Michael Ekstrand    16 年前

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