运营商超载私人内部成员

时间:2014-08-10 20:46:15

标签: c++ operator-overloading

是否可以将私有内部类成员作为非成员重载?在我看来,唯一的方法是作为成员超载。

class Foo
{
private:
    struct Bar
    {
        int a;
        char b;

        Bar& operator+=(const Bar& rhs)
        {
            a += rhs.a;
            return *this;
        }

        // Only possibility?
        inline Bar operator+(const Bar& rhs)
        {
            Bar bar;
            bar.a = this->a + rhs.a;
            bar.b = this->b;
            return bar;
        }
    };

    // Cannot do this as takes implicit reference (to Foo?).
    inline Bar operator+(Bar lhs, const Bar& rhs)
    {
        lhs += rhs;
        return lhs;
    }
};

// Cannot do this as Bar private.
inline Foo::Bar operator+(Foo::Bar lhs, const Foo::Bar& rhs)
{
    lhs += rhs;
    return lhs;
}

我想我可以使用成员重载,但我知道最好将+运算符作为非成员重载,我想将实现分开。

1 个答案:

答案 0 :(得分:1)

看起来没有人愿意声明这一点,我会提供完整性的答案。归功于juanchopanza和Igor Tandetnik。

解决方案是使用friend

class Foo
{
private:
    struct Bar
    {
        int a;
        char b;

        Bar& operator+=(const Bar& rhs)
        {
            a += rhs.a;
            return *this;
        }
    };
    friend Bar operator+(Bar, const Bar&);
};

Foo::Bar operator+(Foo::Bar lhs, const Foo::Bar& rhs)
{
    lhs += rhs;
    return lhs;
}