代码之家  ›  专栏  ›  技术社区  ›  Nick Heiner

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

  •  1
  • Nick Heiner  · 技术社区  · 14 年前

    我希望编译以下内容,但它没有:

    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 回复  |  直到 14 年前
        1
  •  4
  •   James McNellis    14 年前

    Odp 超载 operator* 返回 m_p *this rhs :

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

    然而,过载有点不寻常:它可能会返回 *m_p 相反,因为 operator-> 硕士

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

    这变得有点混乱,如果一元数 & 已过载 T (但是,你真的, ,这可能更可取:

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

    Odp公司 ,为什么要用,为什么不能修改?”


    operator== 应该实现为常量成员函数,或者最好实现为友元函数:

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

    另一个不相关的注释是,重载一元数 & 几乎可以肯定是个坏主意。

        2
  •  0
  •   nathan    14 年前

        3
  •  0
  •   jpalecek    14 年前

    Odp 在它的方法中免费给出指针(甚至是它的地址,OMG!这就像用很多锁做了门,然后把钥匙给周围的每个小偷),你就可以这么做

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

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

    bool operator==(const Ftw& rhs)
    {
        return Odp<int>::operator==(rhs) && ... other conditions ...;
    }
    
        4
  •  0
  •   Maciej Hehl    14 年前

    Odp ,您可以拨打 operator->()