[OpenFOAM] 编程基础 06 Custom Classes

发布于 2024-10-28  123 次阅读


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&gt 通过将 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

编译后,输出结果如下,

Everything not saved will be lost.
最后更新于 2024-10-28