これからOpenFOAMのC++を学ぶために基本的な内容をメモとして残しておきます。
OpenFOAMはC++プログラミング言語により実装されたCFDに必要な機能がまとめられたオブジェクト指向の考え方で設計されているツールです。
C++の基本的な内容を理解する。
テンプレート。
C++の全てを学ぼうとすると膨大過ぎてとても扱いきれないので、必要最低限知っておくとよい内容を簡単にまとめていきます。
関数テンプレート
全く同じ処理ですが関数に引き渡したときのデータの型が違うという場合というのがありますよね。
そんな時は以下のように別々に関数を用意する必要があります。
例えば、
●整数の足し算をしたい場合
●文字列の足し算をしたい場合
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <iostream> #include <string> using namespace std; int add(int n1, int n2) { return n1 + n2; } string add(string s1, string s2) { return s1 + s2; } int main() { cout << add(25, 30) << endl; cout << add("Hello", "World") << endl; return 0; } |
add()という関数を2つ作って「引数のデータの型」と「返り値のデータの型」が異なる別の関数を2つ作る必要があります。
面倒なので以下のよう関数テンプレートを使ってデータの型を引き渡すことができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <iostream> #include <string> using namespace std; template <typename T> T add(T n1, T n2) { return n1 + n2; } int main() { cout << add<int>(25, 30) << endl; cout << add<double>(25.0, 30.5) << endl; cout << add<string>("Hello", "World") << endl; return 0; } |
ポイントは以下の2つですね。
関数テンプレートのイメージとしては add<int>(25, 30)とすることで以下のように関数に引き渡されたデータの型が変わります。
クラステンプレート
クラス内でテンプレートが使用された場合もやってみます。
以下の2つのファイルを用意します。
- calc.h:クラスの定義
- main.cpp:メインファイル
calc.h
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
#ifndef _CALC_H #define _CALC_H template<typename T> class Calc { private: T m_n1; T m_n2; public: inline void set(const T n1, const T n2) { m_n1 = n1; m_n2 = n2; }; inline T add() const{ return m_n1 + m_n2; } }; #endif |
main.cpp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> #include <string> #include "calc.h" using namespace std; int main() { Calc<int> i1; Calc<string> s1; i1.set(25, 32); s1.set("Hello", "World"); cout << i1.add() << endl; cout << s1.add() << endl; return 0; } |
inline関数を使ってクラス内に関数を定義しましたが、クラス内に関数を定義した場合自動的にinline関数になるようですが、ここでは明示的にinline関数の記述を行いました。
2重インクルード防止
2重インクルード防止のためにcalc.hに、
1 2 3 4 5 6 |
#ifndef _CALC_H #define _CALC_H (省略) #endif |
という記述を行いましたが、これは例えばmain.cppでcalc.hをインクルードして、別のファイルでもcalc.hをインクルードして・・・・また別のファイルでもcalc.hをインクルードしてとなると、何回もcalc.hの中身をインクルードしていることになり重複してしまいます。
なので、
●#ifndef _CALC_Hが定義されているかを確認
●#define~#endifまでの記述を1回だけしかインクルードしないようにコンパラに指令を与える役割があります。
以下のようにしてコンパイルを行います。
1 |
g++ main.cpp |
参考記事
OpenFOAMの簡単なコードを書いてカスタマイズ練習ができる内容を挙げておきます。
C++の基礎を学びたいときにとても参考になる動画を挙げておきます。
OpenFOAMに特化した内容を学びたい場合は以下の記事が参考になります。
参考書
持っている参考書をC++の書籍を載せておきます。
↑こちらは初めにC++を学ぶにはちょうど良い内容かと思います。
実はこちらに書籍の内容がまとめられています。
↑基礎が身に付いたら体系的に学ぶために持っていても良いと思う書籍です。
「現行の規格に準拠したC++プログラムの書き方を徹底的に解説していく」と謳っているように内容も中級者以上を対象にした本格的なC++の書籍です。
実はこちらに本の内容がそのままアップされています。