假设我有一个课程如下
class Rectangle{
public:
int height;
int width;
};
如何在不手动说出cout<<a.height
之类的情况下打印出此类成员的列表。换句话说,在不知道不同班级的成员的情况下,有没有办法让我在给出新班级的情况下打印成员?
答案 0 :(得分:7)
似乎你想要重载运算符&lt;&lt;对于std::ostream对象。我假设你想要这样做:
Rectangle rect;
std::cout << rect;
而不是:
Rectangle rect;
std::cout << "Width: " << rect.width << '\n';
std::cout << "Height: " << rect.width;
重载函数(记住重载操作符重载函数,除了特定签名)必须具有以下签名:
std::ostream& operator<<(std::ostream&, const Type& type);
其中std::ostream是ostream
对象(例如文件),在这种情况下它将是std::cout,而Type是您希望为其重载的类型,在你的情况下是矩形。第二个参数是一个const引用,因为打印出来的东西通常不需要你修改对象,除非我弄错了第二个参数不一定是const对象,但建议使用它。
必须返回std::ostream才能使以下内容成为可能:
std::cout << "Hello " << " operator<< is returning me " << " cout so I " << " can continue to do this\n";
这就是你的情况:
class Rectangle{
public:
int height;
int width;
};
// the following usually goes in an implementation file (i.e. .cpp file),
// with a prototype in a header file, as any other function
std::ostream& operator<<(std::ostream& output, const Rectangle& rect)
{
return output << "width: " << rect.width <<< "\nheight: " << rect.height;
}
如果Rectangle类中有私有数据,则可能需要使重载函数成为友元函数。我通常这样做,即使我不访问私人数据,只是出于可读性目的,这取决于你。
即
class Rectangle{
public:
int height;
int width;
// friend function
friend std::ostream& operator<<(std::ostream& output, const Rectangle& rect);
};
std::ostream& operator<<(std::ostream& output, const Rectangle& rect)
{
return output << "width: " << rect.width <<< " height: " << rect.height;
}
答案 1 :(得分:0)
正如其他人所指出的那样,C ++没有提供自动执行此操作的方法。
C ++中的良好编码实践是在一个头文件中提供一个类及其成员的声明,并尽可能地进行评论和记录。头文件与在其中声明的类相同。