Codelogy

« 2007年05月 | メイン | 2007年08月 »

2007年07月 アーカイブ

2007年07月01日

無名列挙子

C/C++ では定数をマクロを用いて記述するのが一般的です。

Date.h (かなり省略)
#define SUN 0
#define MON 1
#define TUE 2
#define WED 3
#define THU 4
#define FRI 5
#define SAT 6

//日付クラス
class Date {
public:

    int year;
    int month;
    int date;

    //コンストラクタ
    int Date(int year, int month, int day);

    //曜の取得
    int WDay() const;

};
main.cpp
#include <stdio.h>
#include "Date.h"

int main(){

    Date d(2008,  6, 30);

    switch (d.WDay()){
    case MON:
    case THU:
        printf("%04d/%02d/%02d => 燃えるゴミの日", d.year, d.month, d.day);
        break;
    case WED:
        printf("%04d/%02d/%02d => 燃えないゴミの日", d.year, d.month, d.day);
        break;
    default:
        printf("%04d/%02d/%02d => ゴミの日ではありません", d.year, d.month, d.day);
        break;
    }

    return 0;
}
2008/06/30 => 燃えるゴミの日

しかしその一方で、名前空間やスコープの制約を受けないため、識別子名の衝突が起こりやすい、という問題があります。 上の例では SUN, MON, ... といった名前が曜日を表す定数の識別子として利用していますが、こうした単純な名前は他の用途の識別子と重複する可能性が高くなるでしょう。
とは言え、他の機能を利用してマクロと同じ機能を実現するのは簡単ではありません。

(1) const 変数を使う
→ コンパイル時に値が確定しない用途 (case ラベル, 静的配列のサイズ指定など) に使えない。
(2) 列挙型 (名前付き enum) を使う
→ 組み込みの整数型からの変換が禁止されているため、算術操作の適用がしづらい。

こうした問題は、無名列挙子 (anonymous/nameless enumration) を使うことで解決できる場合があります。

続きを読む "無名列挙子" »

2007年07月12日

Array クラスを作る (導入編)

C/C++ では、関数の引数・戻り値の型として、配列を扱うことができません。 なので、関数コールをまたいで配列データをやりとりしようとすると、配列の先頭アドレスとサイズの両方を渡して、必要ならバッファを動的に確保して、そこに要素値をコピー……という面倒な手順を踏む必要があります。
しかし、C++ を使っているのならば、自分で配列クラスを作ることでこの面倒を回避できます。

続きを読む "Array クラスを作る (導入編)" »

2007年07月18日

Array クラスを作る (コンストラクタ編)

まずはコンストラクタの定義から。

続きを読む "Array クラスを作る (コンストラクタ編)" »

Array クラスを作る (デストラクタ編)

Array オブジェクトは消滅時に、自分が保持していた配列のメモリ領域を開放しなければなりません。
この解放操作をデストラクタによって実行されるようにします。

続きを読む "Array クラスを作る (デストラクタ編)" »

Arrayクラスを作る (代入演算子編)

コピーコンストラクタと併せて、代入演算子も定義してしまいましょう。

続きを読む "Arrayクラスを作る (代入演算子編)" »

2007年07月27日

Haskell でバグの出にくいプログラミング (1)

ソフトウェア開発で最も時間のかかる作業は、デバッグであると言われています。 よって、バグをいかに出にくくするかで開発効率を改善することができると考えられます。

続きを読む "Haskell でバグの出にくいプログラミング (1)" »

About 2007年07月

2007年07月にブログ "Codelogy" に投稿されたすべてのエントリーです。 過去のものから新しいものへ順番に並んでいます。

Prev: 2007年05月
Next: 2007年08月

メインページアーカイブページもご覧ください。