我可以在 Matrix 类的迭代器中避免循环依赖吗?

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本身具有相同的访问过程)

Ken*_*oom 5

首先,向前声明 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)