0

我很好奇打印用户定义对象的方式。我的意思是把对象打印到输出流。是否有可能让流类提供可以打印各种对象的方法,类似于 Java 中的 Object 类型如何为所有派生类提供 toString() 方法?我想一个问题是缺少能够从流类派生的类,因为在 Java 中的 Object 示例中,所有类都是 Object 的隐式子类。还有其他人吗?

4

6 回答 6

2

由于这是标记为 C++,因此这是一个 C++ 答案:

只是重载std::ostream& operator<<(std::ostream&, const foo& f)做这样的事情:

class foo {
  friend std::ostream& operator<<(std::ostream& os, const foo& f) {
    return os << f.x;
  }
  public:
    // ...
  private:
    int x;
};

int main() {
     foo myfoo;
     std::cout << "myfoo is " << myfoo << '\n';
}

关于如何做到这一点,有更好的指南。

于 2012-04-26T17:17:37.523 回答
1

覆盖该toString()函数并调用它。我不明白你怎么会有一个简单地打印各种对象的神级。

于 2012-04-26T17:10:44.033 回答
0

稍微扩展 Pubby 的答案,您可以使该operator<<功能适用​​于所有流类型,只需稍作修改。这里还展示了如何流式传输.

class foo {
  //output works for all basic_ostreams
  template<class e, class t>
  friend std::basic_ostream<e,t>& 
        operator<<(std::basic_ostream<e,t>& os, const foo& f) 
  {
    return os << f.x;
  }
  //input is very similar.  Here's the differences:
  // istream instead of ostream
  // >> instead of <<
  // foo is not const
  template<class e, class t>
  friend std::basic_istream<e,t>& 
        operator>>(std::basic_istream<e,t>& is, foo& f) 
  {
    return os >> f.x;
  }
  public:
    // ...
  private:
    int x;
};

int main() {
     foo myfoo;
     std::cout << "enter foo: ";
     std::cin >> myfoo;
     std::cout << "myfoo is " << myfoo << '\n';
     std::wcout << L"myfoo is " << myfoo << L'\n';
}
于 2012-04-26T17:29:01.093 回答
0

不可能流式传输所有类型的对象。例如,您将如何流式传输线程?这意味着什么?

于 2012-04-26T17:11:12.220 回答
0

@Aidanc 答案可能有效。一切都取决于你想做什么。如果您想将对象字段打印到控制台,这就是解决方案。

但是,如果您想通过网络发送它们,而不需要任何人阅读流,请使用 ObjectOutputStream。它可以从一个流中写入(并且 ObjectInputstream 可以读取)对象,无论它是什么,无论是套接字还是文件。

几乎所有对象都可以通过这种方式发送,实现 Serializable 的人自己负责它们的序列化(将对象转换为 0 和 1 的序列),对于其他对象,您仍然可以使用 Externalizable Api。

于 2012-04-26T17:13:16.580 回答
0

你想看两件事:

  1. Java 类对象
  2. Java反射的概念

基本上,两者的结合使您可以自省任何给定的对象,因此很容易想出一个通用的方法来打印您想要的对象。IE

String myClassName = "com.my.class.NameHere";
Class c = Class.forName(myClassName);
Method m[] = c.getDeclaredMethods();
for(Method method: m)
  System.out.println(method.toString());
于 2012-04-26T17:14:57.947 回答