为类打印(打印调试信息)的最佳实践是什么?

时间:2015-01-01 07:35:37

标签: c++

我想知道打印课程的最佳做法是什么(比如classA),我有几种方法

classA ca;

1)定义调试方法,在此方法中,打印出所有成员。

2)定义str()方法,并使用cout<< ca.str()

3)定义类似字符串转换的内容(我不确定如何),只需使用cout<< CA

2 个答案:

答案 0 :(得分:3)

通常的方法是大致重载operator<<

std::ostream &operator<<(std::ostream &out, classA const &a) {
  // precise formatting depends on your use case. Do the same thing you would
  // if you wanted to print a to cout or a file, because that is what this code
  // will end up doing.
  out << a.some_data() << ", " << a.some_more_data();
  return out;
}

如果classA的界面有限(不公开所有相关数据成员),则可能需要operator<< friend classA,例如

class A {
public:
  // stuff

  friend operator<<(std::ostream &out, classA const &a);
};

// private members can then be accessed
std::ostream &operator<<(std::ostream &out, classA const &a) {
  out << a.some_private_member << ", " << a.some_other_private_member;
  return out;
}

通常没有充分的理由阻止对私有成员的读取访问,然后允许用户按operator<<转储,因为它将是相当漏洞的访问控制。

然后,您可以编写

classA a;
std::cout << a;

std::ofstream file("foo.txt");
file << a;

std::ostringstream fmt;
fmt << a;
std::string s = fmt.str();

等等。

作为样式注释:可以写

std::ostream &operator<<(std::ostream &out, classA const &a) {
  // precise formatting depends on your use case
  return out << a.some_data() << ", " << a.some_more_data();
}

这实现了与split return相同的功能,因为operator<<(按照惯例)返回传递给它的相同流对象(以启用<<的链接,如std::cout << i << j << k;中所示)。

样式注释2:如果classA中没有任何内容使得困难,那么升级到这种技术就是写

template<typename char_type>
std::basic_ostream<char_type> &operator<<(std::basic_ostream<char_type> &out, classA const &a) {
  // rest as before. Put it in a header because it is a function template now.
}

这使您不仅可以将classA个对象写入coutcerrclogofstreamostringstream等,也适用于wchar_t对等wcoutwcerrwclogwofstreamwostringstream。这些在实践中很少使用,但通常不需要花费任何费用来实现此功能。诀窍是std::ostreamstd::wostream - 所有这些输出流的基类 - 分别是std::basic_ostream<char>std::basic_ostream<wchar_t>的别名。这为我们提供了处理这两个(可能还有其他)字符类的好方法,而没有代码重复。

答案 1 :(得分:0)

如果您想在某个文件中记录进程的步骤并稍后查看该文件以查看出现了什么问题,则可以选择

clog。您还可以通过在文件外部将它们记录在一起来以特定间隔检查数据成员的状态。