看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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