2008年10月23日木曜日

クラスのメンバをヘッダで初期化する

クラスのメンバをヘッダで初期化する
13:49 by Jumpei Tanaka

ますます C++ の忘れっぷりを痛感している今日この頃。
基礎だけど重要なことも飛んだりしている。例のごとくメモ。
定数には「#define」がよく使われているが、
あるクラス自体の定数など、内部でしか使わないものはそのクラスのメンバ変数にしておきたい。
ただ、コンストラクタとかメンバイニシャライザで初期化するのって面倒臭いし、
何よりもコードが読みにくいので出来る限りヘッダで初期化しておきたい。
・・・そんな時は以下!
 
-----------------
class Human{
private:
  // int 範囲の場合は enum で対処可能
  enum {
    m_eLegCount = 2,
    m_eArmCount = 2,
    m_eFingerCount = 5
  };
}
-----------------

int の範囲ならこれで。
ただ、文字列や配列もやりたい。
その場合はヘッダ ( .h ) では無理なので実装部 ( .cpp ) で初期化する。
 
-----------------
// .h file とする
class Human{
private:
  // ここで初期化したメンバは以下の宣言で使える
  enum {
    m_eMaxNameCount = 50
  }
  // メンバ定数分の配列を確保している
  // static の場合は外部で初期化できる
  static const char szName[m_eMaxNameCount];
}
// .cpp file とする
const char Human::szName = "Suzuki Ichiro";
-----------------

static なら、private でも外部で初期化できる。
また、ここで static の表記は不要。
 
以上。
 
 
 
 

2008年10月18日土曜日

別プロセスに文字列を渡す ( プロセス間通信? )

別プロセスに文字列を渡す ( プロセス間通信? )
13:50 by Jumpei Tanaka

10月から、再びVC++の案件に携わっている。
約一年ぶりのVC++ということもあり、忘れていることが多くて悪戦苦闘の日々だ。
だが、それがいい。
 
さて、本題の「別プロセスへ文字列を渡す方法」だが、
凡ミスで1時間ほど無駄な努力をしてしまったので、メモしておく。
 
手法はいくつかあるが、今回は WM_COPYDATA というメッセージを使って実装したのだが、
何故か受信側が WM_COPYDATA を受け取ってくれなかった。
そのほかのメッセージは届くというのに!
 
で、よく調べてみたら SendMessage じゃないとメッセージが届かないということが判明。
PostMessage は、受信側の応答を待たずに送信側の処理が進むため、送信データの領域を開放するタイミングがわからないのが原因らしい。
メッセージ自体が届かないということが問題を切り分けしづらくして厄介だった。