列出C ++类的成员

时间:2013-05-27 12:12:26

标签: c++ class object

假设我有一个课程如下

class Rectangle{
    public:
    int height;
    int width;

};

如何在不手动说出cout<<a.height之类的情况下打印出此类成员的列表。换句话说,在不知道不同班级的成员的情况下,有没有办法让我在给出新班级的情况下打印成员?

2 个答案:

答案 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::ostreamostream对象(例如文件),在这种情况下它将是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 ++中的良好编码实践是在一个头文件中提供一个类及其成员的声明,并尽可能地进行评论和记录。头文件与在其中声明的类相同。