ショートカット
ファシリテーター × あり方
コーディングの向こう側
Hello, ANOTHER world!
オブジェクト指向のはなし
プログラミングのはなし
C言語実力診断クイズ
eSkillBooks
オブジェクト指向のはなし

メッセージの記述

導入

C++ でのメッセージ送信メンバ関数の実行で実現されます。

解説

オブジェクト指向では、オブジェクト同士がメッセージ送信によって協調動作します。概念的には、各オブジェクトがそれぞれ独立的に存在し、必要に応じて通信を行っています。しかし現実の C++ ではそうなってはいません。

C++ でのメッセージ送信は、実際にはメンバ関数の呼び出しで表現されます。オブジェクトがメッセージを受け取ったときに、それに応じたメソッドが起動されるのではありません。オブジェクトの利用者が直接メソッドを起動します。

メソッドの起動は C 言語の関数呼び出しとほぼ同等です。したがって、オブジェクトがそれぞれ並列動作しているわけではありません。

次のコードは以前に掲載したものと全く同じですが、メソッドの起動が行われています。

SAMPLE CODE
クラスの使用例(ファイル名:"main.h")


#include <iostream>
using namespace std;

#include "test.h"


// main 関数
int main()
{
    // 花子さん誕生
    Human Hanako( "Yamada Hanako" );
    
    // 太郎くんはいま26歳
    Human Taro( "Yamada Taro", 26 );
    
    // 2人は1つずつ年をとりました
    Hanako.IncreaseAge(); ... (メソッド起動)
    Taro.IncreaseAge(); ... (メソッド起動)
    
    // 今何歳?
    cout << Hanako.Name() << " ... " << Hanako.Age() << endl; ... (※)
    cout << Taro.Name()   << " ... " << Taro.Age()   << endl; ... (※)
    
    return 0;
}
なお、上記コード中の (※) の部分にある Hanako.Name() などは、文法的にはメソッドの起動とかわりありません。しかし概念的には「属性の取得」です。これについては前のトピックを参照してください。

オブジェクトを並列動作させるためにはスレッド化が必要ですが、そのための方法はいまのところ標準化されていません。どうしても必要な場合は API などを駆使することになります。この方法は、当然システム依存です。

なお、Java にはスレッドを記述する標準的な方法が用意されています。

これは私の個人的な予測ですが、将来的にはスレッド操作が C++ 言語の文法として、または標準ライブラリとして組み込まれると思います。つまり、オブジェクトがそれぞれ並列動作できるようになると思われます。そうなれば、本当のメッセージ送信の機構も標準化されるでしょう。しかし現在のような直接関数を呼び出す方法も、実行速度を最適化するために残されるでしょう。

もっと!
もっと詳しく知りたい人は次の用語について調べると良いでしょう:
  • Java の Thread クラス

(「オブジェクト指向のはなし」は1999年2月から2000年4月にかけて作成されたコンテンツです。)