0

我正在实现一个特定类的迭代器,迭代器需要访问A成员,也A需要访问iterator——我希望能够声明A::iterator it;

我知道我可以简单地将一个类嵌套在另一个类中,在这种情况下,我会:

class A {
public:
    class iterator {
    };
};

但是类Aiterator本身都有大量的代码,我想把这些类分成两个不同的文件。

这里的问题是 classA自然会#include iterator.hpp,但iterator也需要 include A,以便实现正确的迭代器运算符。这就是我坚持的地方:即使添加了包含警卫,我也无法让它发挥作用。


这是我所拥有的一个片段:

a.hpp

# include iterator.hpp
# ifndef A_HPP
# define A_HPP

template <typename T>
class A {
public:
    typedef iterator<T> iterator;
};

迭代器.hpp

# include a.hpp
# ifndef ITERATOR_HPP
# define ITERATOR_HPP

template <typename T>
class iterator {
public:
    // Constructor
    iterator(A<T> *a) {
    }
};

课程更大,这就是我没有发布整个代码的原因


Obs:如果不可能执行这种递归包含,但我仍然可以设法将类iterator嵌套在 的命名空间中A,但在 class 外部声明A,这就足够了。

4

2 回答 2

3

前向声明消除了大部分这些问题。请注意,您不必在类定义中定义成员函数;当所有类型都已定义后,您可以稍后定义它们。(如果有帮助,请在黑板上写 100 遍:C++ 不是 Java)。

class C;

class Iterator {
    // member function declarations
    // member data
};

class C {
    // member function declarations
    // member data
};

// member function definitions go here; there is
// no problem using C inside member
// functions of Iterator and vice versa
于 2013-04-04T12:26:37.967 回答
1

也许使该类成为迭代器的模板参数。然后迭代器将不需要立即访问该类。

班级:

#include "iterator.hpp"
template <typename T>
class A {
public:
  typedef Iterator<A, T> iterator;
};

迭代器:

template <typename C, typename T>
class Iterator {
  Iterator (C* a);
}
于 2013-04-04T12:40:08.933 回答