あなたの場合、 constw
であることには何の問題もありません。h
次の方法でコンストラクタを記述できます。
MyImage(unsigned int** _image,unsigned int _w,unsigned int _h)
: w(_w), h(_h)
{
// No data is allocated in the memory pointed to by image yet
// We have to allocate it here. Remember, that copy-ctor is
// a constructor, so it operates on newly created instance,
// not on an existing one.
image = new unsigned int * [h];
for (int i = 0; i < h; i++)
{
image[i] = new unsigned int [w];
memcpy(image[i], _image[h], w * sizeof(unsigned int));
}
}
私の画像処理の経験から、画像を 1 つのテーブルとして行ごとに格納することを検討してください。を呼び出すことで (x, y) 番目の要素にアクセスできますdata[y * w + x];
。そのような場合、コピー ctor を単純化できます。
MyImage::MyImage(unsigned int * source, int newW, int newH)
: w(newW), h(newH)
{
image = new unsigned int[w * h];
memcpy((void *)image, (void *)source, w * h * sizeof(unsigned int));
}
C++ コミュニティがこの用語を理解しているように、コピー コンストラクターは次のようになります。
MyImage::MyImage(const MyImage &source)
: w(source.w), h(source.h)
{
image = new unsigned int[w * h];
memcpy((void *)image, (void *)source.image, w * h * sizeof(unsigned int));
}
image
コンストラクターを呼び出したときにフィールドが存在しないことに注意してください。したがって、何も解放する必要はありません。
// Your code
MyImage(unsigned int** _image,unsigned int _w,unsigned int _h)
{
// Class is allocated into some part of memory, which might
// have been used, so in effect this may be actually true,
// because image may contain some rubbish data
if (image)
{
// But this will result mostly likely in Access Violation
// error, because you would try to use (free!) some random
// data in memory.
for (int i = 0;i < w;++i)
delete[] image[i];
delete[] image;
}
// .. copy _image to imge
}
いくつかのイメージ (unsigned int * または別の Image クラスに格納されている) の内容を Image の既存のインスタンスにコピーする assign のようなメソッドが必要な場合は、constw
にh
することはできません。