1

假设我有一堂课如下

class Rectangle{
    public:
    int height;
    int width;

};

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

4

2 回答 2

7

您似乎想为std::ostream对象重载 operator<< 。我假设你想做这样的事情:

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 是您希望为其重载的类型,在您的情况下将是 Rectangle 。第二个参数是一个常量引用,因为打印出来的东西通常不需要你修改对象,除非我弄错了第二个参数不一定是常量对象,但建议这样做。

它必须返回一个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 类中有私有数据,您可能希望使重载函数成为友元函数。即使我不访问私人数据,我通常也会这样做,只是为了便于阅读,这取决于你。

IE

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;
}
于 2013-05-27T12:17:32.157 回答
0

正如其他人指出的那样,C++ 没有提供自动执行此操作的方法。

C++ 中良好的编码实践是在与其中声明的类同名的头文件中提供类及其成员的声明,并尽可能地注释和记录。

于 2013-05-27T12:35:52.377 回答