|
最近何だかどんどんMFCの話から離れていくような気がしてならない。今日もまた、MFCとは関係のない話を書こうと思っている。しかし、基本的なことを知っていなければ駄目ですよ!ということで、見逃して欲しい・・・。
前置きはさておき、今日のお題は「 コピーコンストラクタ 」である。この単語を聞いて、「 そんなの知ってるよ!けっ 」っと言う方は飛ばしてください・・・。 C(++)言語には非常に便利な機能がたくさん備わっている。その中でも、特にすばらしい!と感じているのがコピーコンストラクタである。簡単に言うと、クラスの複製支援である。 ここで、一つのデータクラスを考えてみよう。 |
|
|
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;
}
}
|
|
|
|
こんな感じだろうか。 これでも、データが 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;
}
が可能になる。
今回日記に記したものは知っていればものすごく役に立つし、知らなければすごくプログラムが複雑になり、デバックが大変である。これを知らなかった人は是非覚えて欲しい。 |