openFoam源码中涉及到的c++思想有很多,因为在计算流体力学中,域的创建尤为重要,我们可以在域中存储我们想要的物理变量如速度、压力等等。
首先:有一个宏观上的思维,我们用的大多数域对应的C++类是GeometricField,这个类里面包含了很多信息,但他的Base类其实是Field这个类,可以用下图来表示这个关系:
在这里插入图片描述
在这里插入图片描述
分析
当然,一切要从代码看起:
首先看Field基类,找到Filed的.C和.H头文件开始分析:
该类都是在Foam这个大的命名空间底下,下面定义了很多模板类。
template
class Field;
//- Pre-declare related SubField type
template
class SubField;
template
void writeEntry(Ostream& os, const Field&);
template
Ostream& operator<<(Ostream&, const Field&);
template
Ostream& operator<<(Ostream&, const tmp<Field>&);
// 类的前置声明
class dictionary;
复制
这里用到了很多模板类的语法,首先声明了两个模板类的前置声明Field以及SubField,在这里要注意的是为什么要进行前置声明:
由于某些原因不方便在头文件中直接引入另一个模板类的头文件,但声明变量是需要用到该模板类型,这时候就要用到模板类的前置声明
可以看到操作符重载的参数列表里用到了Field,这就必须进行前置声明,可能此时大家又有疑问,为什么操作符的重载也要进行前置声明呢,这是可以看到在Filed这个大的模板类里有这样一段友元函数的声明:
在这里插入图片描述
在这里插入图片描述
有这样一条规定:友元函数