C ++:在相等测试中使用基类的私有成员

时间:2010-08-05 00:13:46

标签: c++ inheritance operator-overloading

我想要编译以下内容,但它没有:

template <typename T>
struct Odp
{
public:
    operator*() const
    {
        return m_p;
    }

    T* operator->() const
    {
        return m_p;
    }

    T** operator&()
    {
        return &m_p;
    }

private:
        T* m_p;

};

struct Ftw : public Odp<int>
{
    bool operator==(const Ftw& rhs)
    {
        return m_p == rhs.m_p; // C2248 cannot access private member
    } 
};

有没有办法让这项工作?我无法修改Odp

4 个答案:

答案 0 :(得分:4)

Odp重载operator*以返回m_p。您可以在*thisrhs上调用运算符:

struct Ftw : public Odp<int>
{
    bool operator==(const Ftw& rhs) const
    {
        return **this == *rhs;
    } 
};

operator*重载有点不寻常:它应该返回*m_p,因为operator->返回m_p(这会导致你的类具有一致的指针 - 类似语义)。如果您这样做,则必须执行以下操作来进行比较:

return &**this == &*rhs; // or explicitly as:
return &this->operator*() == &rhs.operator*();

这有点乱,如果&的一元T超载,它就不一定有效(但是,你真的,真的不应该去做...)。您还可以通过显式调用operator->来获取指针,这可能是更好的选择:

return this->operator->() == rhs.operator->();

真正的问题是,“这是Odp是什么,为什么要使用它,为什么不能修改它?”


在不相关的注释中,您的operator==应该作为const成员函数实现,或者最好作为友元函数实现:

bool operator==(const Ftw& rhs) const { /* ... */ }
friend bool operator==(const Ftw& lhs, const Ftw& rhs) { /* ... */ }

在另一个不相关的说明中,重载一元&几乎肯定是一个坏主意。

答案 1 :(得分:0)

编译器告诉你m_p是私有的。如果要在派生类中访问m_p,则需要将其设置为受保护或公开。

答案 2 :(得分:0)

如果您无法修改Odp,则可以明确调用operator->()。它返回您需要的内容,并且应该内联。

答案 3 :(得分:0)

由于Odp在其方法中提供了免费指针(即使是地址,OMG!就像用许多锁制作门,然后将钥匙交给每个小偷),你可以做到

bool operator==(const Ftw& rhs)
{
    return **this == *rhs;
}

如果Odp实现了自己的比较运算符,您可以像这样使用它:

bool operator==(const Ftw& rhs)
{
    return Odp<int>::operator==(rhs) && ... other conditions ...;
}