打印用户定义对象的方法

时间:2012-04-26 17:08:39

标签: java c++ object printing

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

6 个答案:

答案 0 :(得分:1)

覆盖toString()功能并调用它。我不知道你怎么能拥有一个只打印各种物体的神级。

答案 1 :(得分:1)

由于这是标记的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';
}

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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

但是如果你想通过网络发送它们,而没有任何人阅读流,请使用ObjectOutputStream。它可以从流中写入(和ObjectInputstream可以读取)对象,无论它是套接字还是文件。

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

答案 4 :(得分:0)

你想看看两件事:

  1. Java类对象
  2. Java反思的概念
  3. 基本上,两者的结合允许您对任何给定对象进行内省,因此很容易想出一个通用方法来打印您想要的对象。即。

    String myClassName = "com.my.class.NameHere";
    Class c = Class.forName(myClassName);
    Method m[] = c.getDeclaredMethods();
    for(Method method: m)
      System.out.println(method.toString());
    

答案 5 :(得分: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';
}