Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为C+中的每个方法调用执行特定代码+; 我有一个C++类要检查。所以,我希望所有的方法都能打印出它们的参数和返回值,就在出来之前_C++_Methods - Fatal编程技术网

为C+中的每个方法调用执行特定代码+; 我有一个C++类要检查。所以,我希望所有的方法都能打印出它们的参数和返回值,就在出来之前

为C+中的每个方法调用执行特定代码+; 我有一个C++类要检查。所以,我希望所有的方法都能打印出它们的参数和返回值,就在出来之前,c++,methods,C++,Methods,后者看起来有点容易。如果我对所有内容都返回()宏 #define return(a) cout << (a) << endl; return (a) #define return(a)cout对我来说,听起来你想使用调试工具。这将允许您查看所需的所有参数。如果您的方法都是虚拟的,您可以使用以非常优雅的方式实现 编辑:从您上面的评论(您想要统计数据的输出)我得出结论,您肯定应该使用decorator模式。它是为这种东西设计的 然而,打印输入似乎更重要 困难。有什么办法我能

后者看起来有点容易。如果我对所有内容都返回()宏

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

#define return(a)cout对我来说,听起来你想使用调试工具。这将允许您查看所需的所有参数。

如果您的方法都是虚拟的,您可以使用以非常优雅的方式实现

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

然而,打印输入似乎更重要 困难。有什么办法我能做到吗, 使用C++结构或用 权宜之计

没有



更新:我的回答将失去一些简洁性,因为我建议您可以通过应用来实现所需的功能。

我想到了几个选项:

  • 使用调试器
  • 根据建议使用空格_C0wb0y。但是,这可能需要大量手动键入,因为您必须复制修饰类中的所有方法,并自己添加日志记录。也许您可以在类上运行decorator对象,然后解析其输出,从而自动创建decorator对象
  • 使用。(您想要做的就是日志记录,它是AOP的一个常见应用程序。)C++的一些AOP实现:,和

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

    • 在构造函数中记录方法的项
    • 提供转储任意参数的方法
    • 提供记录状态的方法
    • 日志以析构函数中记录的状态退出
    • 用法如下所示:

      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));
      }
      
      unsignedlong
      阶乘(无符号长n){
      检查员检查(“阶乘”、“文件”、“行”);
      检查参数(“n”,n);
      if(n<2){
      返回检查结果(1);
      }
      返回检查结果(n*事实(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));
      }
      
      unsignedlong
      阶乘(无符号长n){
      注射检验人员(n);
      if(n<2){
      退货检验(1);
      }
      退货检验(n*事实(n-1));
      }
      

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

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

      有什么原因不能只使用调试器吗?是的,我想将输入和输出发送到文件以处理数据。我不想调试这个方法,它显然是正确的,并且经过了很好的测试。我不想看到参数。我想输出所有这些,以便做一些不同的事情,比如统计研究,等等,这不是实用程序的一部分。子类化在这种情况下也能实现同样的效果,不是吗?然而,这不是我要找的!装饰和子类化都需要编写与脏技巧(到处打印)相同数量的代码。不过,我还必须更改调用方代码。嗯,在你的个人资料中说,你喜欢好的设计。。。遗憾的是,在C++中实现设计模式总是伴随着大量的锅炉板,但它仍然具有高灵活性的好处。是的,我非常喜欢设计模式,GoF是我每次坐在桌子上的唯一的书。但我认为这件事太过分了。我想为开发人员提供一个临时的“开启”/“关闭”功能。很抱歉,我当时有点紧张。你当然是对的,你必须为每个问题选择合适的解决方案。AOP提示+1!但是,请阅读我对任何建议我使用调试器和空格的人所做的关注。修饰或子类化会让我更改调用方代码。即使我能做到,我也不想。最好使用defines(#ifdef STATS…#endif)进行适当的更改,而不是对创建的此类的每个对象都进行修饰调用。很好,尽管varargs可能会有问题。C++对ValARGS函数的使用效果不好,最终需要使用它。它们是支持的,但实际上只适用于C值。我在考虑“代码>注册表检查器< /代码>中的变量参数列表宏,虽然它们还没有正式地被C++化。C++中的VARARGS函数肯定会被破坏,以任何实际的方式使用。我将为每个参数使用一个单独的
      参数(名称、值)
      调用,使调用成为模板,并利用iostreams进行格式化。我今天在实践中使用了类似的东西;)日志可以很好地完成他正在寻找的工作,它将比打印每一行稍微干净一些,但是您将有一个额外的库(除非他已经有一个库)。