Tam*_*man 2 c++ templates class circular-dependency
我们有两个班级:
template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix
Run Code Online (Sandbox Code Playgroud)
和
template<typename T, typename Size>
class Iterator
Run Code Online (Sandbox Code Playgroud)
Matrix 应该能够返回开始和结束迭代器,并且 Iterator 将保持对 Matrix 的引用以通过其接口访问元素。我们不希望 Iterator 依赖于 Matrix 的内部存储来防止耦合。我们如何解决这个循环依赖问题?
(内部Storage类与Matrix类具有相同的模板参数,与Matrix本身具有相同的访问过程)
首先,向前声明 Matrix 类。这允许 Iterator 类查看 Matrix 类的名称,并创建指向它的指针和引用。(它还不允许 Iterator 类访问成员数据或调用成员函数。)
template<typename T, typename Size, typename Stack, typename Sparse>
class Matrix;
Run Code Online (Sandbox Code Playgroud)
然后,定义 Iterator 类。此时它所能做的就是保存对 Matrix 的引用和指针。(还不能访问 Matrix 的成员。)
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
};
Run Code Online (Sandbox Code Playgroud)
然后定义Matrix类(可以访问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
};
Run Code Online (Sandbox Code Playgroud)
然后为每个类定义方法体。此时,两个类的方法都可以访问彼此的成员。通常,这部分在 .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(){ /*...*/ }
Run Code Online (Sandbox Code Playgroud)