【问题标题】:Inner Class access to Outer Class members内部班级访问外部班级成员
【发布时间】:2011-08-09 14:08:54
【问题描述】:

我对这个话题很困惑,基本上我有这个代码:

template <typename T>
class SListArray
{
public:
    class const_iterator
    {
    public:
        const_iterator(size_t i_currentNode = -1)
            :m_position(i_currentNode)
        {
        }

        T const& operator*() const
        {
            return m_data[m_position].element;
        }

        // ...

    protected:
        size_t m_position;
    };

    explicit SListArray();

    // ...

private:
    std::vector<Node<T>> m_data;

    // ...
};

这段代码给了我一个编译器错误,所以,我想知道是否可以让内部类访问外部类的成员。

谢谢。

【问题讨论】:

标签: c++


【解决方案1】:

嵌套类已经可以访问包含类的成员,假设它们有一个指向包含类的指针/引用来操作。您的迭代器需要存储对外部类的引用,以便能够按照您的需要访问容器。

另请注意,受保护的数据通常是代码异味,通常应避免使用。如果合适,首选私有数据和受保护的接口。

编辑:除非这严格来说是学习如何编写容器的练习,否则只需使用 C++ 标准容器之一,例如 vector,这些容器经过良好开发、调试和优化。

【讨论】:

  • 是的,正如我对 Nawaz 所说,这是一种练习。关于受保护的数据,之所以如此,是因为我有一个继承自 const_iterator 的迭代器类。
  • @enigma 你确定关系代表替代吗?从长远来看,从 const_iterator 继承迭代器可能会导致比短期内解决的问题更多。
  • 非常量迭代器可以(甚至应该)从 const_iterator 派生。通常这样比较非 const 和 const 迭代器、将非 const 迭代器分配给 const-iterator 等会容易得多。这是一个适当的替换:在可以使用 const_iterator 的任何地方,也可以使用非常量迭代器。
【解决方案2】:

正如 Sjoerd 已经回答的那样,您可以使用 friend 关键字授予访问权限。但是,如果您正在寻找 Java 风格的内部类,那么 C++ 中没有这样的东西。

【讨论】:

    【解决方案3】:

    是的,使用朋友声明。

    private:
      std::vector<Node<T> > m_data;
      friend class const_iterator;
    

    更新:哦,你对m_data 的访问是错误的。如果没有指向外部类实例的指针,内部类就无法访问外部类的成员。所以你必须调整你的const_iterator类来存储一个指向外部类的指针/引用,并在operator*()中使用这个指针/引用。

    【讨论】:

    • 谢谢,很清楚。是的,在我的代码中,对 m_data 的访问是错误的。
    【解决方案4】:

    虽然让const_iterator成为SListArray的朋友会解决你的问题,但我想知道你为什么不使用std::vector。为什么还有一个新的泛型类?

    如果您正在寻找新名称,那么您可以typedef 为:

    typedef std::vector<Node<int>>                 NodeList;
    typedef std::vector<Node<int>>::iterator       NodeIterator;
    typedef std::vector<Node<int>>::const_iterator NodeConstIterator;
    

    【讨论】:

    • 你的观察是正确的。但我只是以不同的形式实现一个单链表,以供练习。
    【解决方案5】:

    传递参考:

    class const_iterator {
    public:
       const_iterator(ListArray<T> &arr) : arr(arr) { }
    private:
       ListArray<T> &arr;
    };
    

    然后你也需要朋友的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-26
      • 2012-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-28
      • 2020-09-11
      • 1970-01-01
      相关资源
      最近更新 更多