【问题标题】:Ways to print user-defined objects打印用户定义对象的方法
【发布时间】:2012-04-26 17:08:38
【问题描述】:

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

【问题讨论】:

  • 等等,你想知道如何在 C++ 中打印对象,就像我们使用 Java 的 toString() 一样,或者你想知道如何用两种语言打印对象,或者你在问什么?

标签: java c++ object printing


【解决方案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';
}

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

【讨论】:

  • 如果你使用了一些我不知道的奇怪语法:appologies。否则:我为您修复了一些语法错误,并添加了使用代码。
  • @MooingDuck Na,只是在打字之前没有想太多。
【解决方案2】:

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

【讨论】:

  • 从标志来看,我想他想知道如何用 C++ 打印
【解决方案3】:

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

【讨论】:

    【解决方案4】:

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

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

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

    【讨论】:

    • 从标志来看,我想他想知道如何用 C++ 打印
    【解决方案5】:

    你想看两件事:

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

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

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

    【讨论】:

    • 从标志来看,我想他想知道如何用 C++ 打印
    【解决方案6】:

    稍微扩展 Pubby 的答案,您可以使 operator&lt;&lt; 函数适用于所有流类型,只需稍作修改。这里还展示了如何在 in 中进行流式传输。

    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';
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-09
      • 1970-01-01
      • 2013-08-26
      相关资源
      最近更新 更多