我们有两门课:
template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix
和
template<typename T, typename Size>
class Iterator
矩阵应该能够返回开始和结束迭代器和迭代器将保持引用矩阵,以访问元素通过它的接口。我们不希望Iterator依赖于矩阵的内部存储来防止耦合。我们如何解决这个循环依赖问题?
(内部存储类与矩阵类具有相同的模板参数,与矩阵本身具有相同的访问过程)
发布于 2010-05-18 05:25:13
为了迭代,迭代器通常需要知道它们迭代过的内部存储--这种耦合通常是无法避免的。以一个地图迭代器为例,它必须了解映射的内部树结构,才能完成它的工作。
发布于 2010-05-18 05:31:20
首先,前向声明矩阵类。这允许Iterator类查看矩阵类的名称,并进行指针和对其的引用。(它还不允许Iterator类访问成员数据或调用成员函数。)
template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix;
然后,定义Iterator类。此时它所能做的就是保存对矩阵的引用和指针。(尚未接触到矩阵的成员。)
template<typename T, typename Size>
class Iterator{
// don't define any function bodies in here
//but do put all data members and prototypes in here
};
然后定义矩阵类(可以访问Iterator成员)
template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix{
// don't define any function bodies in here
//but do put all data members and prototypes in here
};
然后为每个类定义方法体。此时,两个类的方法都可以访问对方的成员。通常,这个部分在.cpp文件中,但是对于模板,它属于.h文件。
template<typename T, typename Size, typename Stack, typename Sparse>
Matrix<T,Size,Stack,Sparse>::Matrix(){ /*...*/}
template<typename T, typename Size>
Iterator<T,Size>::Iterator(){ /*...*/ }
发布于 2010-05-18 05:50:11
在这里,使用嵌套类也是合适的,它可以减少所需的模板参数的数量。
template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix{
public:
class Iterator{
// define Iterator members here
};
// declare Matrix members here
}
https://stackoverflow.com/questions/2857589
复制