从类中访问类中的类对象

时间:2014-11-14 23:21:51

标签: c++ class iterator nodes

我知道这个标题有点令人困惑但是图表可能会有所帮助。 在一个文件中:

#ifndef ...
#def  ...
#includes (including OListiterator.h>
template <class T>
class OList;
template <class T>
Class OListiterator{
    friend class OList<T>::OList;
    typename OList<T>::Node* iiter;
};
function defs;
#endif

在另一个:

#ifndef ...
#def ...
#includes (one is OList.h)
template<class T>
class OListiterator;
template <class T>
Class OList{
     friend class OListiterator<T>::OListiterator;
     public:
          class Node{
          };
      //things
};
//functions
#endif

这就是我和TA协助我认为会起作用的,但我抛出了错误:Node没有在OList中命名一个类型。有谁知道我为什么/如何解决这个问题?如果我需要发布更多内容,请告诉我。

3 个答案:

答案 0 :(得分:0)

看起来这里存在依赖关系。 OList需要OListIterator,反之亦然。解决这个问题的方法是改变你的设计,这样就不需要这种依赖。尝试放置OListIterator设计,以便在OList内使用。

答案 1 :(得分:0)

您需要class OList的正向声明:

// forward declaration
template <class T>
class OList;

template <class T>
class OListiterator{
    friend class OList<T>::OList;
    typename OList<T>::Node* iiter;
};

template <class T>
class OList{
     friend class OListiterator<T>::OListiterator;
public:
    class Node{
    };
};

Demo

请注意,friend class OList<T>::OList;仅相当于friend class OList<T>;,因为OList<T>::OList是在OList<T>范围内注入的类名。

答案 2 :(得分:0)

当您将Node的成员OList命名为朋友时,编译器需要OList的完整定义以确保存在此类成员。

解决方案是打破依赖性。为什么列表节点需要访问列表迭代器的内部?在我看来应该是相反的。