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

时间:2014-05-18 15:48:32

标签: c++ stream operator-overloading stream-operators

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

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

现在我想将流提取运算符实现为described in this answer

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;
};

代码无法使用此错误消息进行编译:{{1​​}}。如何正确覆盖流提取操作符?它应该区分类型并且是可链接的。

2 个答案:

答案 0 :(得分:3)

作为自由函数,操作员签名应为:

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

作为成员函数(您的情况),它应该是:

Foo& operator >>(size_t& value);

答案 1 :(得分:2)

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

因此,对于全局函数,例如<。p>

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;
    }
};

成员函数和朋友函数之间的区别很微妙但非常重要。