C++

【OpenFOAMの理解のためのC++メモ(2)】クラスの定義、ファイル分割、継承

これからOpenFOAMのC++を学ぶために基本的な内容をメモとして残しておきます。

OpenFOAMはC++プログラミング言語により実装されたCFDに必要な機能がまとめられたオブジェクト指向の考え方で設計されているツールです。

本記事の内容

C++の基本的な内容を理解する。
クラスの定義、ファイルの分割について。

C++の全てを学ぼうとすると膨大過ぎてとても扱いきれないので、必要最低限知っておくとよい内容を簡単にまとめていきます。

クラスの定義

クラスと言えばプログラム実行のための設計図のようなものです。

●クラスの定義
●クラスのインスタンス化(実態を作る)
●クラス内のメンバ関数、メンバ変数にアクセス

こちらを意識していれば良いでしょう。

main007.cpp

【結果】

aの入力を求められるので「20」と打ちます。

こちらのコードでは以下でクラスの定義を行っています。

変数定義の範囲指定には3つあります。

  • praivate:クラスのメンバ関数のみがアクセス可能
  • public:クラスのすべてのユーザがアクセス可能
  • protected: 基底クラスから派生したどのクラスのメンバーおよびフレンドからアクセス可能

main()関数で

とすることでクラスのインスタンス化を行い「mc」という名前でクラスの実態を作っています。

クラス内のメンバ変数やメンバ関数を呼び出すには、

  • mc.b:メンバ変数へのアクセス
  • mc.set_a():メンバ関数へのアクセス

とします。

BMIの計算

もう少し意味のあるコードを書いてみましょう。

身長と体重からBMIを計算するプログラムです。

main008.cpp

身長と体重をターミナル上に入力すると以下のようにBMIを計算してくれます。

【結果】

ポインタからアクセス

クラスオブジェクトをポインタを使ってメンバ関数にアクセスすることができます。

↑このようなアロー演算子によりメンバ関数にアクセスできます。

main009.cpp

【結果】

コンストラクタ:初期値

クラスのインスタンス化した時点で実行してくれる関数を定義します。
それがコンストラクタと呼ばれるものです。

コンストラクタの実装 コンストラクタ名はクラス名と同じにしなければなりません。

main010.cpp

【結果】

引数のあるコンストラクタ

コンストラクタによる初期化関数にデフォルト引数を指定することができます。

main011.cpp

【結果】

デストラクタ

デストラクタは、スタック上に作成されたオブジェクトが自動的に破棄されるときに呼び出される関数で「クラス破棄時の後処理」です。

デストラクタは以下のようにクラス内で定義します。

main012.cpp

【結果】

クラスからメンバ関数を

と2回定義しているため、main()関数を抜けるときにはデストラクタが2回呼び出されています。

ヘッダーファイルとメインファイルを分ける

C++はソースコードから計算実行できる実行形式ファイルに変換する必要があります。これをコンパイルと言います。

コードが長くなるとひとつのファイルに全てを記述するのではなく、機能ごとにファイル分けしておく方が汎用性も高く、管理がしやすいため今回はソースファイルを複数に分割したプログラムを書きました。

■ヘッダーファイルには基本的に関数宣言やクラス定義だけを書いておきます。
sample.h

2重インクルード防止のためにcalc.hに、

という記述を行いましたが、これは例えばmain.cppでcalc.hをインクルードして、別のファイルでもcalc.hをインクルードして・・・・また別のふぁいるでもcalc.hをインクルードしてとなると、何回もcalc.hの中身をインクルードしていることになり重複してしまいます。
なので、
●#ifndef _SAMPLE_H_が定義されているかを確認
●#define~#endifまでの記述を1回だけしかインクルードしないようにコンパラに指令を与える役割があります。

モジュールファイルとしてsample.cppとし、ここにはクラス内の関数を書きます。冒頭にヘッダーファイルをインクルードして元のクラス定義を参照します。

sample.cpp

後は、main.cppでメインファイルを作成するだけです。

main.cpp

Sample obj;はクラスのインスタンス化を行っている部分です。
obj.set(num)とobj.get()でクラス内のメンバ関数にアクセスしています。

分割コンパイル

今回は以下の3つのファイルがあります。

  • sample.h :クラス定義のヘッダーファイル
  • sample.cpp :クラス内メンバ関数の定義のファイル
  • main.cpp :メインファイル

これらすべてをコンパイルして、さらにそれぞれのリンクで結合する必要があります。

C++のコンパイルはこちらを参考にしました。

まずはmainファイルからオブジェクトファイルを作成します。

そうするとmain.oというオブジェクトファイルが生成されます。

次にsample.cppのオブジェクトファイルを生成します。

最後に、2つのオブジェクトファイルをコンパイルしてリンクさせます。
これをリンカーと言います。

そして、./a.outを実行すれば完成(‘ω’)ノ

こんな感じですね。

画像1

分割ファイルにした場合にコンパイルが面倒ですがMakefileを使って一括でコンパイルすることができます。

クラスの継承

CSampleクラスの機能を保持したまま拡張して使いたい場合は、クラスの継承を行います。(親クラス︓CSample,派⽣クラス,⼦クラス︓NewCSample)

■ヘッダーファイルには基本的に関数宣言やクラス定義だけを書いておきます。
sample.h

sample.cpp

main.cpp

先ほど同様

参考記事

OpenFOAMの簡単なコードを書いてカスタマイズ練習ができる内容を挙げておきます。

C++の基礎を学びたいときにとても参考になる動画を挙げておきます。

OpenFOAMに特化した内容を学びたい場合は以下の記事が参考になります。

参考書

持っている参考書をC++の書籍を載せておきます。

1週間でC++の基礎が学べる本

1週間でC++の基礎が学べる本

亀田 健司
2,574円(11/21 15:26時点)
発売日: 2021/03/12
Amazonの情報を掲載しています

↑こちらは初めにC++を学ぶにはちょうど良い内容かと思います。
実はこちらに書籍の内容がまとめられています。

独習C++ 新版

独習C++ 新版

高橋 航平
3,346円(11/21 15:27時点)
発売日: 2019/11/11
Amazonの情報を掲載しています

↑基礎が身に付いたら体系的に学ぶために持っていても良いと思う書籍です。

江添亮のC++入門

江添亮のC++入門

江添 亮
5,500円(11/21 17:59時点)
Amazonの情報を掲載しています

「現行の規格に準拠したC++プログラムの書き方を徹底的に解説していく」と謳っているように内容も中級者以上を対象にした本格的なC++の書籍です。
実はこちらに本の内容がそのままアップされています。

COMMENT

メールアドレスが公開されることはありません。 が付いている欄は必須項目です