2011-04-08 56 views
1

我有下面的變量,我需要使用,並且必須編寫自己的包裝器才能完成作業。我超越了賦值(因爲我將不得不使用這個包裝器),並且想要在包裝器中重載下標操作符,以便將它與雙指針數組一起使用。我的意思的代碼是這樣的:重載下標運算符並使用雙指針?

我有什麼:

從給定的標題爲庫:

typedef struct {  // A pixel stores 3 bytes of data: 
    byte red;  // intensity of the red component 
    byte green;  // intensity of the green component 
    byte blue;  // intensity of the blue component 
} pixel; 

typedef struct { 
    int rows, cols; /* pic size */ 
    pixel **pixels;  /* image data */ 
} image; 

我的類(當然包括在報頭):

pixels& MyWrapper::operator[] (const int nIndex) { 
    return Image.pixels[nIndex]; // where Image is of type image 
} 

當然,這不起作用,因爲雙指針返回一個指針,這不是我所說的返回,但返回*像素&也不會返回它。爲了滿足我的好奇心,並幫助我理解爲什麼這是不可能的,有人可以告訴我,如果它可以完全實現,爲什麼會這樣呢?請記住,我不太瞭解指針(我知道它們是如何工作的基礎知識,但多數民衆贊成在它),並希望用它來擴大我的理解。

+0

...嗯......你應該嘗試像素*而不是? – quasiverse 2011-04-08 07:20:08

+0

...或者只是將像素*作爲一個像素數組返回,並在其上使用[]? – 2011-04-08 10:50:41

回答

1

目前還不清楚爲什麼你首先使用雙重間接。

如果pixels是一個雙指針像素陣列,你可以做

pixels& MyWrapper::operator[] (const int nIndex) { 
    return (*Image.pixels)[nIndex]; // where Image is of type image 
} 

如果pixels是一個指向指針數組的數組,那麼你需要兩個指標:

pixels& MyWrapper::operator() (int xIndex, int yIndex) { 
    return Image.pixels[yIndex][xIndex]; // where Image is of type image 
} 

這裏有一些奇怪的事情發生在這裏。

  • typedef class { } identifier不好C++。使用class identifier { };,否則該類沒有名稱,因此您不能在class { }作用域之外定義成員函數。 (其中包括其他問題)
  • 沒有理由使參數類型const int。普通int完成相同的事情。
  • 雙重間接沒有明顯的理由。通常在C++中我們避免直接使用指針。可能需要使用預先包裝的標準結構。
+0

當使用多個索引時,'operator()'應該優於'operator []'。後者只能使用「雙」或類似的結構。 – 2011-04-08 08:17:25

+0

@Tad:我只是沒有足夠的重視:vP。 – Potatoswatter 2011-04-08 08:31:42

+0

你是對的,那第二次超載是正確的。謝謝。 – Smartboy 2011-04-08 17:33:15

-1
+0

我無法控制庫,不能使用它,我不得不使用雙指針,這就是爲什麼我問。 – Smartboy 2011-04-08 13:38:54

0

這是比較典型的,對於C++:

#include <vector> 

namespace AA { 

    class t_point { 
    public: 
     t_point(const size_t& X, const size_t& Y) : d_x(X), d_y(Y) { 
     } 
     const size_t& x() const { return this->d_x; } 
     const size_t& y() const { return this->d_y; } 

    private: 
     size_t d_x; 
     size_t d_y; 
    }; 

    class t_array { 
    public: 
     // abusive, but possible. prefer `at` 
     const int& operator[](const t_point& idx) const { 
      return this->at(idx.x(), idx.y()); 
     } 

     const int& at(const t_point& idx) const { 
      return this->at(idx.x(), idx.y()); 
     } 

     const int& at(const size_t& x, const size_t& y) const { 
      return this->d_objects[x][y]; 
     } 
    private: 
     // or use your c image representation... 
     std::vector<std::vector<int> > d_objects; 
    private: 
     static const int& ctest(const t_array& arr) { 
      const t_point pt(1, 2); 
      return arr[pt]; 
      return arr.at(pt); 
      return arr.at(pt.d_x, pt.d_y); 
     } 
    }; 

} 

在這種情況下,使用一個索引的大問題就在於它不清楚哪個指數(像素)你是嘗試訪問,同時將所有座標計算推送給客戶端。如果它是單個指針,那麼仍然會將問題推送到客戶端,但是您可以可預測地訪問索引。

with double ...內存中的佈局可以變化,但不一定是連續的。將它作爲單個值(邏輯上,作爲一維數組)發佈,而不是二維數組或點(例如)發佈它只是一個糟糕的設計。

+0

我無法控制庫,不能使用它,我不得不使用雙指針,這就是爲什麼我問。 – Smartboy 2011-04-08 13:46:29

+0

好的。語法將與書寫'op []'和'at'相同。使用這個c接口,你必須添加你自己的邏輯來進行邊界檢查,內存管理,複製,偏移構造,座標偏移(如果適用)等等。下標符號的功能就是用你想要的索引乘以元素偏移量。第一個將確定像素的行或列的地址,然後第二個將返回,然後爲行或列中的像素應用另一個偏移量。 – justin 2011-04-08 17:16:56