Please refresh the page if equations are not rendered correctly.
---------------------------------------------------------------
在Custom Classes这个教程中,一共有五个文件,分别是customClass.C, customClass.H, derivedClass.C, derivedClass.H以及OFtutorial6.C。
customClass.H
#include "fvCFD.H"
class customClass
{
private:
label myInt_;
在OpenFOAM中,label类型实际上是一个整数类型,将成员声明为private意味着只有该类的成员函数可以访问这些变量或方法。所以后面又get和set方法来供外部操作myInt_。
public:
customClass();
~customClass();
- 构造函数 (customClass()):构造函数是一种特殊的成员函数,当创建类的对象时自动调用。它用于初始化对象的状态或分配资源。
- 析构函数 (~customClass()):析构函数也是一种特殊的成员函数,当对象的生命周期结束时自动调用。它用于清理资源或执行其他必要的清理操作。或者可以打印“对象调用结束”之类的提示。
inline label get() const {return myInt_;};
- inline 建议编译器尝试将函数的代码直接嵌入到调用点,而不是通过常规的函数调用机制进行调用,这可以提高性能
- label 函数的返回类型
- get 函数名
- const 这个关键字表明函数不会修改类的任何成员变量
- return myInt_; 读取myInt_的值
inline void set(label newInt) {myInt_=newInt;};
同理,这个函数set的返回类型是void,没有const关键字,表明允许修改对象,可将newInt赋值给myInt_。
label basicFunction() const;
是成员函数的声明,表示该函数返回一个 label 类型的值,并且不会修改类的状态。
void meshOpFunction(fvMesh& mesh);
};
声明了一个返回类型为 void 的函数,接受一个 fvMesh 引用作为参数。fvMesh& mesh 表示一个对 fvMesh 对象的引用。这种方式允许你在函数中对传入的网格进行操作,而不需要复制整个对象。“Passing a reference rather than the entire mesh object instance by value is much more memory efficient - in short, only one mesh object exists and this method only learns to talk to it rather than make a new, separate copy.”
customClass.C
#include "customClass.H"
customClass::customClass()
{
myInt_= 0;
}
这里先把之前写的头文件加载进来。在头文件中声明了一个自定义类,并声明了一个构造函数,这里我们定义这个构造函数具体干什么,它把myInt_的初始值设置为0。
customClass::~customClass()
{}
那析构函数呢?啥也没干。
label customClass::basicFunction() const
{
Info << "Calling customClass::basicFunction()" << endl;
return myInt_*2;
}
那basicFunction函数呢?打印了一行字,并返回了两倍的myInt_。
void customClass::meshOpFunction(fvMesh& mesh)
{
Info << "Custom class got a mesh with " << mesh.C().size() << " cells" << endl;
myInt_ = mesh.C().size();
}
最后一个函数,打印网格的数量,并把网格数量传给了myInt_。
derivedClass.H
#include "fvCFD.H"
#include
#include 是C++标准库中的一个头文件,它提供了一些类和函数,使得我们可以操作字符串。
class myDict : public IOdictionary
一个类 myDict,它继承自IOdictionary,IOdictionary的位置:$FOAM_SRC/OpenFOAM/db/IOobjects/IOdictionary
{
public:
myDict(const IOobject& ioObj);
~myDict();
void printTokensInTheDict() const;
};
这段就不用解释了,看懂了前面的这里也就知道在干什么了。
derivedClass.C
#include "derivedClass.H"
myDict::myDict(const IOobject& ioObj):IOdictionary(ioObj){}
这一行定义了myDict的构造函数,并说明该类继承自IOdictionary。它调用了基类IOdictionary的构造函数,并将ioObj作为参数传递。
myDict::~myDict()
{}
析构函数啥也没干。
void myDict::printTokensInTheDict() const
{
定义了myDict类的一个成员函数,
- void:这表示函数不返回任何值。
- const:这个关键字表示该函数不会修改myDict实例的任何成员变量。
List characters(this->tokens());
- this->tokens() 调用当前实例的 tokens() 方法
- List<token> 通过将 token 类与 List 类结合使用,可以方便地存储和操作从输入文件中解析出的字符串
std::stringstream ss;
ss << "Tokens in the file:";
- 创建一个 std::stringstream 类型的对象 ss
- 使用 << 操作符将字符串 "Tokens in the file:" 写入 stringstream 对象 ss 中。
forAll(characters,i)
if (characters[i].isWord())
ss << "\n" << tab << characters[i].wordToken();
遍历token list,如果当前 token 是一个单词,这行代码将其写入到 std::stringstream ss 中。
Info << ss.str().c_str() << endl;
}
- ss.str() 获取拼接后的字符串
- .c_str() 变为C风格字符串
OFtutorial6.C
编译后,输出结果如下,
Comments NOTHING