Hello World
- 起動して【Creste a new XCode project】
- iPhoneのアプリを作るのでないなら,【Command Line Tool】
- あなたがこれから作っていく,多数のプログラムを入れるフォルダーの名前を設定する.
【Product Name】my_damn_project 【Language】C++ - ファイルをどこにおくか尋ねてくるので,適当に選択.なお,選択した所に,Product Nameのフォルダーが作られ,そこに色々なファイルが配置される.
- すると,下記のなんじゃこりゃ画面が登場する.これは,まあ,後で説明することにして,左の【main.cpp】をクリックする
- 既にプログラムができている.そこで【再生】すると,プログラムがコンパイルされ,実行される.
Hello Class
プログラム言語というのは,要するに
- なんらかの数値を保存しておき
- なんらかの計算を行なって
- 計算結果を表示したり保存したりする
ものです.数値を保存にはデータ変数を用い,計算や各種の作業には関数を用います.
サンプルに表示されているmain()も関数で,これはお約束により
- プログラムが実行開始すると, main()関数を呼び出す.
- main()関数が終了すると,プログラムは停止する.
古生代には,各種作業をmain()内部に書いていましたが,それではお友達と成果を交換することができない(mainを交換すると,作業全てが交換されてしまう.そうじゃなくて,作業の一部だけ,利用したい)ので,困ってしまいました.
ジュラ紀ぐらいになると,自分の開発した作業を,別の関数に書くようになりました(Fortran言語, C言語など).しかし,データ変数はmain()に残ったままなので,やっぱり交換できませんでした.データを保存しておく変数もいちいち交換しなければならず, 大変時間がかかったのです.
そこで,関数とデータをセットにしたらいいんじゃなイカ?と思いついた人がいました.それをオブジェクトと呼び,オブジェクトを用いたプログラムを「オブジェクト指向」と言います.
C++は,オブジェクト指向を実現した第一世代のプログラム言語です.JavaだのPythonだの新しい言語も,オブジェクト指向を実現しています.オブジェクト指向により「ファイルを保存しますか YES/NO」などを複数画面に表示しても停止しないソフトウェアが実現でき,ワードプロセッサやスマートデバイスがこの世界に出現しました.
さっそくオブジェクトを作りましょう.C++では,オブジェクトの定義をCLASSと呼びますので,クラスというのを作成します.
- 【ファイル】【New】【File】で,【C++ File】を選びます.
- ファイルを入れるフォルダーを聞いてきますが,まあデフォルトでOK
- 現状, クラス名.cpp とクラス名.hpp が作成されます:
- クラスのcppファイルにプログラムを書くことも可能です.ですが,2010年くらいから,全てをhppに書いたほうが計算が早いことがわかってしまいましたので,hppに書きましょう.
-
hppをクリックして,次のように書いてみましょう:
わかんねえって人のために,コードを表示しておく#ifndef takorice_hpp
#define takorice_hpp
#include <iostream>
class tako_rice
{
public:
tako_rice(){
std::cout << "ぼなぺち" << std::endl;
}
~tako_rice(){
std::cout << "よろしうおあがり" << std::endl;
}
};
#endif /* takorice_hpp */なお,全角の空白「 」を使うとロクでもないことが起こるので, 英数字の空白「 」を使いましょう.
- 自分の作ったクラスを, main関数で起動してみます.main.cpp をクリックして,次のように入力:
説明としては- tako_riceクラスの設計図を,#include で読み込み
- tako_riceクラスのオブジェクト yummy_TACO を作成
- そのまま終了
- 再生してみると
- yummy_TACO が起動すると, コンストラクタ(起動時の定型作業)で「ぼなぺち」と表示される.
- プログラムの終了とともに, yummy_TACOが終了する.このときデストラクタ(終了時の定型作業)で「よろしうおあがり」が表示される.
- もちろん,起動時・終了時以外の作業も定義できます.が,まあ,初めてですので,自分の計算はコンストラクタあるいはデストラクタに全部書いてしまって大丈夫でしょう.
- 変数は,クラスの中で定義できます:
- クラスの中の変数は, 別のオブジェクトとは独立です.例えば
例えば流体領域が3つの部分から構成されている場合,考え方が異なってきますね.
オブジェクト指向
- 流体領域には,流速場と圧力場がある.それは流体領域クラスに定義する
- 流体領域では,◎とか▲とか■の作業があるので,流体領域クラスに定義する
- で,その領域が3個ある
- 流体領域,という概念はただ一つである→クラスの定義は一つだけである
- 流体領域は複数→オブジェクトは,3つ別々にある.それぞれ別個の流速場と圧力場がある.
- 他人にプログラムを渡す場合,流体領域クラスを渡せば良い.
- 他所に固体領域クラスや,制御法則クラスがあったとしても,それは無関係
- したがって,少々複雑で開発者が数百人になっても問題はない.
- 多数の開発者を調停する神様は居たほうが良い. 神が不在でも, しばらくは気が付かない
非オブジェクト指向
- 3つの流体領域があるから,main()に3個の流速場と温度場を定義する
- それらへの◎とか▲とか■の作業は,別関数sub()に定義する.
- 作業が共通な場合,流速場や温度場に番号 i をつけて識別し, sub(i) と呼び出す.
- 他人にプログラムを渡す場合,main()の変数と作業関数を渡せば良い
- そりゃ要するにプログラム全部,ってことですけどね.
- 固体領域変数や制御法則変数が含まれるなら,バッティングを避けるため理解する必要がある.
- うっかり,制御法則でも利用している関数 p() を変更してしまう間違いがあり得る.
- 発生する可能性がある間違いは, 経験的には,なぜか100%の確率で発生する.
- したがって,全てを理解した神プログラマー1名の指揮のもとで開発が進む.
- 神が病気にでもかかって死ぬと,プロジェクトも終わりを告げる.