在另一个类的命名空间中声明一个类,而不进行显式嵌套声明
Declare a class inside another class' namespace without explicit nested declaration
我正在实现一个特定类的迭代器,迭代器需要访问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);
}
相关文章:
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- 如何在嵌套类中正确使用友元声明?
- 具有嵌套类声明的类模板 (C++)
- 如何在该接收类之外声明嵌套类的方法
- MSVC 2017 - 错误 - 如何将模板类 X 的模板成员函数声明为嵌套类 X::Y 的好友
- 以嵌套类为参数的友元模板声明
- 我们可以在main函数中声明嵌套类对象吗
- C++中嵌套模板声明的限制
- 类外的前向声明有效,但在嵌套时无效
- 声明嵌套在模板参数中的类型的变量?
- 这个嵌套结构声明是什么意思?
- 声明嵌套基模板类实例是派生类的好友
- C++17 是否允许向前声明嵌套类
- 有没有办法在C++中预先声明嵌套类
- 声明嵌套结构的指针
- 如何正确声明嵌套类
- 如何在层次结构头文件中声明嵌套类型
- 带嵌套类的链表:如何在声明嵌套类类型之前使用它
- 无法在 main 中声明嵌套类的即时。"对 Class::NestedClass::NestedClass() 的未定义引用;
- 前向声明嵌套在模板类中的模板类