如何在类中实现提取操作符

How to implement the extraction operator in a class?

本文关键字:实现 提取 操作符      更新时间:2023-10-16

我有一个类,它将二进制文件的部分内容读入不同类型的变量中。

class Foo {
public:
    size_t getSizeT();
    float getFloat();
    std::string getString();
private:
    std::ifstream stream;
};

现在我想实现这个答案中描述的流提取操作符。

class Foo {
public:
    Foo &operator>>(Foo &foo, size_t &value);
    Foo &operator>>(Foo &foo, float &value);
    Foo &operator>>(Foo &foo, std::string &value);
private:
    std::ifstream stream;
};

代码编译失败,显示以下错误信息:error C2804: binary 'operator >>' has too many parameters。如何正确覆盖流提取操作符?它应该区分不同的类型,并且是可链接的

作为自由函数,操作符签名应该是:

Foo& operator >>(Foo& foo, size_t& value);

作为成员函数(你的例子),它应该是:

Foo& operator >>(size_t& value);

如果您的类的一个实例是数据源,那么您有两种方式来编写输入操作符函数:要么作为一个独立的全局函数,接受两个参数,类的实例和目标对象。或者你把它写成类的成员函数,然后它只接受一个参数,即目标。

对于一个全局函数,你可以这样写,例如

class Foo { ... };
Foo& operator>>(Foo& foo, int& i)
{
    // Get an integer and writes to `i` here
    return foo;
}

对于成员函数,可以这样写:

class Foo
{
public:
    ...
    Foo& operator>>(int& i)
    {
        // Get an integer and writes to `i` here
        return *this;
    }
};

我认为你写错了操作符的原因是,你可以把第一个版本,使用全局函数,写成friend函数内联在类中,在你把友元函数和成员函数的区别搞混之前,你已经看到了。

使用好友函数,如

class Foo
{
public:
    ...
    // Notice the keyword `friend` 
    friend Foo& operator>>(Foo& foo, int& i)
    {
        // Get an integer and writes to `i` here
        return foo;
    }
};

成员函数和友元函数的区别很微妙,但是非常重要。