在另一个类的命名空间中声明一个类,而不进行显式嵌套声明

Declare a class inside another class' namespace without explicit nested declaration

本文关键字:声明 嵌套 一个 命名空间 另一个      更新时间:2023-10-16

我正在实现一个特定类的迭代器,迭代器需要访问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之外声明,这就足够了。

前向声明消除了大部分这些问题。注意,你不必在类定义中定义成员函数;当所有类型都定义好之后,您可以稍后再定义它们。(如果有帮助,在黑板上写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

可以将该类作为迭代器的模板实参。这样迭代器就不需要立即访问该类了。

类:

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

迭代器:

template <typename C, typename T>
class Iterator {
  Iterator (C* a);
}