作者littleshan (我要加入劍道社!)
看板C_and_CPP
標題Re: [問題] 一維陣列轉三維陣列 (影像檔)
時間Mon Sep 26 01:19:05 2011
※ 引述《MiguelC (MC)》之銘言:
: 然後要存取的時候 直接用 下面的概念
: char oprator[][][] (int x, int y, int z) {
: return *(p_image_array + 3*x + y*width + z);
: }
: 但是當然的 overloading 不支援自創的 operator
: 所以我的想法不知道怎麼實現
: 請問各位大大 我的想法要怎麼做出來??
: 感謝^^
operator overloading 只能針對一層 index operator
如果讓「一層的 index operator」回傳另一種型態的物件
並且針對該物件再改寫 index operator
就可以做到你要的效果
具體做法如下 (以下 code 未考慮宣告順序,實際使用時請加入適當的前置宣告):
class Image {
public:
Column operator[](int x)
{
return Column(this, x);
}
char* data()
{
return my_image;
}
int width()
{
return my_width;
}
private:
char* my_image;
int my_width, my_height;
};
class Column {
public:
Column(Image& image, int x)
: my_image(image), my_x(x)
{}
Pixel operator[](int y)
{
return Pixel(my_image, my_x, y);
}
private:
Image& my_image;
int my_x;
};
class Pixel {
public:
Pixel(Image& image, int x, int y)
: my_image(image), my_x(x), my_y(y)
{}
char operator[](int z)
{
return my_image.data()[ my_image.width()*my_y + 3*x + z];
}
private:
Image& my_image;
int my_x, my_y;
};
透過額外類別 Column 及 Pixel 的協助 (以C++的術語來說,通常稱之為 proxy class)
就可以用三層的 [] 來取得 pixel 中的其中一個 channel
Image img = Read(...);
img[10] ← 這樣會得到一個 Column 物件
img[10][20] ← 對 Column 物件使用 operator[] 因此得到 Pixel
img[10][20][1] ← 對 Pixel 物件使用 operator[] 因此得到 char
不過我個人不是很喜歡這樣的設計啦
因為滿容易寫錯的
而且這是 column major 的儲存方式和一般 C++ array 的方式又不一樣
因此我比較傾向於針對 () 做 operator overload
img(10, 20, 1) ← 取得 (10, 20) 的第二個 channel
這樣的好處是參數愛放幾個就放幾個,要改也很簡單
用 proxy class 就很麻煩了
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.168.57.229
→ loveme00835:ref member 要特別注意 copy 時的行為 09/26 01:59
推 MiguelC:感謝 我研究一下 09/26 12:58