私有内部成员的运算符重载

3

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

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

我想我可以使用成员重载,但是我知道最好将+操作符作为非成员函数进行重载,并且我希望将实现分开。


3
你可以在类内部将该运算符声明为 friend - juanchopanza
1
可以通过像@juanchopanza建议的那样将运算符声明为友元来进行重载。问题在于,除了其他友元和类成员外,没有其他人(包括外部)能够访问内部类Foo :: Bar,因为它是私有的,所以没有其他人可以调用此operator+。你的目的是什么?将Bar声明为公共,这不是更简单吗? - Christophe
1
“Bar”将被其他私有方法内部使用,没有理由让它成为公共的。 - Daniel
@juanchopanza,我似乎无法按照您的建议作为非成员(即使是朋友)实现 - Bar 是私有的,防止制作本地副本。 - Daniel
1
这就是我的意思,如果我正确理解了你的问题,它应该可以工作。 - juanchopanza
显示剩余4条评论
1个回答

2

似乎没有人想要认领这个问题,我将提供完整的答案。感谢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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接