Answers:
在C ++中,您可以重载operator<<
for ostream
和您的自定义类:
class A {
public:
int i;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.i << ")";
}
这样,您可以在流上输出类的实例:
A x = ...;
std::cout << x << std::endl;
如果您operator<<
希望打印出类的内部结构A
并且确实需要访问其私有成员和受保护成员,则还可以将其声明为朋友函数:
class A {
private:
friend std::ostream& operator<<(std::ostream&, const A&);
int j;
};
std::ostream& operator<<(std::ostream &strm, const A &a) {
return strm << "A(" << a.j << ")";
}
friend
,并且也声明为类的主体内的内容-这样,您就不必using namespace
对包含运算符(和该类)的名称空间进行操作,但是只要该类的对象是ADL,它就可以找到它。操作数之一。
dump
公共方法是肮脏且不必要的。使用friend
此处非常好。friend
尽管friend
可以说是为了这个确切的目的而引入的,但是您是选择冗余方法还是侵入式方法完全取决于口味。
operator<<()
成员函数不起作用:您必须使其成为其成员函数,std::ostream
才能接受type的左手操作数std::ostream
。
您也可以通过这种方式来实现多态:
class Base {
public:
virtual std::ostream& dump(std::ostream& o) const {
return o << "Base: " << b << "; ";
}
private:
int b;
};
class Derived : public Base {
public:
virtual std::ostream& dump(std::ostream& o) const {
return o << "Derived: " << d << "; ";
}
private:
int d;
}
std::ostream& operator<<(std::ostream& o, const Base& b) { return b.dump(o); }
toString
行为。
在C ++ 11中,最终将to_string添加到标准中。
http://en.cppreference.com/w/cpp/string/basic_string/to_string
ToString()
是在所有对象的基类上定义的虚函数,因此用作表示任何对象的字符串表示形式的标准方法。这些功能std::string
仅适用于内置类型。C ++中的惯用方式是重写<<
自定义类型的运算符。
operator<<
与String
Java的简单语义相比 ,的标准签名的“丑陋” 促使我指出,这to_string()
不仅是“有用的补充”,而且还是C ++中实现该目标的新首选方式。如果像OP那样A
需要一个类的自定义字符串表示形式,则只需编写string to_string(A a)
下面的定义class A
就足够了。就像Java中那样,它是通过继承传播的,并且可以像Java中那样进行组合(通过添加字符串)。toString()
无论如何,在Java中不可覆盖是有限的。
作为对约翰所说内容的扩展,如果要提取字符串表示形式并将其存储在a中,std::string
请执行以下操作:
#include <sstream>
// ...
// Suppose a class A
A a;
std::stringstream sstream;
sstream << a;
std::string s = sstream.str(); // or you could use sstream >> s but that would skip out whitespace
std::stringstream
位于<sstream>
标题中。
问题已经回答。但我想添加一个具体的例子。
class Point{
public:
Point(int theX, int theY) :x(theX), y(theY)
{}
// Print the object
friend ostream& operator <<(ostream& outputStream, const Point& p);
private:
int x;
int y;
};
ostream& operator <<(ostream& outputStream, const Point& p){
int posX = p.x;
int posY = p.y;
outputStream << "x="<<posX<<","<<"y="<<posY;
return outputStream;
}
此示例需要了解操作员重载。