我正在为特定类实现迭代器,迭代器需要访问A
成员,而A
需要访问iterator
- 我希望能够声明A::iterator it;
我知道我可能只是将一个类嵌套在另一个中,在这种情况下,我会:
class A {
public:
class iterator {
};
};
但是,类A
和iterator
本身都有很多代码,我想将这些类拆分为两个不同的文件。
这里的问题是,类A
自然会#include iterator.hpp
,但iterator
也需要包含A
,以便实现正确的迭代器运算符。这就是我坚持的地方:即使添加包含警卫,我也无法使其工作。
以下是我所拥有的片段:
a.hpp :
# include iterator.hpp
# ifndef A_HPP
# define A_HPP
template <typename T>
class A {
public:
typedef iterator<T> iterator;
};
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
的命名空间中,但是在类A
之外声明,这就足够了。
答案 0 :(得分: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
答案 1 :(得分: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);
}