打印用户定义对象的方法
Ways to print user-defined objects
我对打印用户定义对象的方式很好奇。我的意思是将对象打印到输出流。是否可以让流类提供可以打印各种对象的方法,类似于 Java 中的对象类型可以向所有派生类提供 toString() 方法?我想一个问题是缺乏能够从流类派生的类,因为在 Java 中的 Object 示例中,所有类都是 Object 的隐式子类。还有其他人吗?
由于这是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';
}
关于如何做到这一点,有更好的指南。
覆盖 toString()
函数并调用它。我不明白你怎么能有一个简单地打印各种对象的神类。
不可能
流式传输所有类型的对象。例如,您将如何流式传输线程?这意味着什么?
@Aidanc答案可能有效。一切都取决于你想做什么。如果要将对象字段打印到控制台,这就是解决方案。
但是,如果您想通过网络发送它们,例如,没有任何人读取流,请使用 ObjectOutputStream。它可以从流中写入(并且 ObjectInputstream 可以读取)对象,无论它是什么,套接字或文件。
几乎所有对象都可以以这种方式发送,实现可序列化的对象自己负责序列化(将对象转换为 0 和 1 的序列),对于其他对象,您仍然可以使用外部化 API。
你想看两件事:
- Java 类对象
- 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());
稍微扩展 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';
}
相关文章:
- 使用std::函数映射对象方法
- C++优先级队列,按对象的唯一指针的特定方法升序排列
- 按对象的特定方法按升序排列的C++优先级队列
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 从父类方法返回子类对象
- 在他自己的方法中,有可能将一个对象取消引用到另一个对象吗
- 为什么此派生对象无法访问基类的后递减方法?
- c++, 在子类中,如何在没有对象的情况下访问父类的方法?
- 正在调用shared_ptr对象方法
- 将方法转换为调用该方法的成员函子对象会导致崩溃
- 检查哪个对象调用了另一个对象的对象方法
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 直接在 unordered_map 的方法中使用哈希,而不是生成哈希的用户定义对象
- 没有取消引用/解包对象的标准方法?
- 使用 gmock c++ 在真实对象上调用方法
- 当我调用对象的方法时,对象的成员会发生变化
- 根据对象类调用不同的方法
- 如何在C++中循环访问未知对象方法?
- 使用动态实例化的对象填充矢量的快速方法
- 对类中的对象使用方法