在没有显式嵌套声明的情况下在另一个类的命名空间内声明一个类

时间:2013-04-04 12:12:55

标签: c++ include iterator declaration

我正在为特定类实现迭代器,迭代器需要访问A成员,而A需要访问iterator - 我希望能够声明A::iterator it;

我知道我可能只是将一个类嵌套在另一个中,在这种情况下,我会:

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

但是,类Aiterator本身都有很多代码,我想将这些类拆分为两个不同的文件。

这里的问题是,类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之外声明,这就足够了。

2 个答案:

答案 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);
}