antenn-a
company profile

MFC航海日記 十五日目(コピーコンストラクタ)

最近何だかどんどんMFCの話から離れていくような気がしてならない。今日もまた、MFCとは関係のない話を書こうと思っている。しかし、基本的なことを知っていなければ駄目ですよ!ということで、見逃して欲しい・・・。

前置きはさておき、今日のお題は「 コピーコンストラクタ 」である。この単語を聞いて、「 そんなの知ってるよ!けっ 」っと言う方は飛ばしてください・・・。
C(++)言語には非常に便利な機能がたくさん備わっている。その中でも、特にすばらしい!と感じているのがコピーコンストラクタである。簡単に言うと、クラスの複製支援である。
ここで、一つのデータクラスを考えてみよう。

prev

class   DATA
{
public:
    int       num[ 100 ];
    CString   name[ 100 ][ 100 ];
};
こんな感じのクラスを作り、このクラスの複製を作ろうと思ったらどうするだろうか?私だったら以下のようにするだろう。
void    CopyData( DATA src, DATA dst )
{
    int    lc;
    
    for( lc = 0; lc < 100; lc++ ){
        dst.num[ lc ] = src.num[ lc ];
        dst.name[ lc ] = src.name[ lc ];
    }
}
今は例として簡単なものにしたが、このデータが100種類有ったとしたら・・・・想像するだけで嫌になってしまう。
私がよく体験するのは、下のようなケースである。
class    PATTERN_DATA
{
public:
    int        Num[ 200 ];
    CString    Name[ 200 ];
    int        TotalNameNum;
}

class   PATTERNS
{
public:
    PATTERN_DATA    Patterns[ 50 ];
};
この場合でクラスPATTERNSのデータメンバーPatternsの5番目を削除して、後ろのデータを前に詰めたい。この場合、泣いてしまうほど大変である。
これを行う場合、以下のようにしないといけない
void DelPattern( int delnum )
{
    int  lc;
    int  lc2;
    
    for( lc = delnum; lc < 50; lc++ ){
        for( lc2 = 0; lc2 < 200; lc2++ ){
            Patterns[ lc ].Num = Patterns[ lc + 1 ].Num;
            Patterns[ lc ].Name = Patterns[ lc + 1 ].Name;
        }
        Patterns[ lc ].TotalNameNum = Patterns[ lc + 1 ].
        TotalNameNum;
    }
}

prev

こんな感じだろうか。
これでも、データが public だからいいものの private だったりすると大変極まりない!ここで、
Patterns[ lc ] = Patterns[ lc + 1 ];
とできたらどんなに楽だろうか!
コピーコンストラクタとは、まさにそれを行うものなのである。やり方は簡単!
class    PATTERN_DATA
{
public:
    PATTERN_DATA()  //標準のコンストラクタ
    {
    }
    PATTERN_DATA( const PATTERN_DATA& ) 
    //コピーコンストラクタ
    {
    }
};
こうするだけである。

2つ目のコンストラクタがコピーコンストラクタと呼ばれるもので、const型の自分自身のクラス名を参照型でもらうのである。 こうしておくと、
void    CopyPattern
( PATTERN_DATA src, PATTERN_DATA dst )
{
    dst = src;
}
が可能になる。
今回日記に記したものは知っていればものすごく役に立つし、知らなければすごくプログラムが複雑になり、デバックが大変である。これを知らなかった人は是非覚えて欲しい。


antenn-a

prev next


antenn-a