2010-06-28 20 views
3

我想創建一個C++對象來包裝外部外圍設備的RAM。我試圖設置如下內容:如何將遠程設備映射爲C++中的數組?

Peripheral p;

p [4] = 10;

int n = p [5];

爲此,我需要讀寫數組元素時訪問外設。 我不能解決如何使用操作符重載等操作。我可以返回一個可在第二行中用作左值的「訪問器」對象:

PeripheralAccessor Peripheral :: operator [](int i);

或我可以定義可用於讀取從所述外圍的int在第三行「簡單」運算符:

INT外設::操作符[](INT I);

但我不能讓這兩個共存給予外設的讀寫訪問權限。我可以將第二個運算符定義爲一個常量(右值)運算符,但它只會被調用爲該類的常量實例,這對於我的需要是不夠的...

希望我已經解釋了什麼我試圖在這裏清楚地實現;有人可以建議我應該怎麼做(或者確實是否有可能)?

回答

3

通常的方式來處理,這是使用代理對象:

class register_proxy { 
public: 
    register_proxy &operator=(int value) { 
     write_value(value); 
    } 

    operator int() { 
     return read_value(); 
    } 
}; 

class peripheral { 
    register_proxy registers[4]; 
public: 

    register_proxy &operator[](int reg_num) { return registers[reg_num]; } 
}; 

我省略了一些細節(怎麼樣,你告訴對方register_proxy讀什麼實際註冊號/寫 - 通常是由傳遞一個參數給Ctor)。無論如何,總體思路非常簡單:operator[]返回對代理對象的引用。代理對象的operator int(或當然需要的任何類型)在分配的右側使用時會被調用。在代理對象的operator=位於賦值的左側時會被調用,因此您正試圖在其中寫入值。

+0

+1,在寫同樣的事情。 – 2010-06-28 18:42:11

+0

@尼古拉同樣在這裏。 – Cogwheel 2010-06-28 18:43:49

+0

輝煌,謝謝。這是事實,你可以這樣做: operator int() 我沒有解決。 – Jonny 2010-06-28 18:56:26

1

由於你不能基於返回類型進行重載,所以你必須選擇一個或另一個(並且你不能選擇int,因爲你沒有得到左值行爲)。但是,您可以將PeripheralAccessor自動轉換爲int。

編輯:傑裏打我。代碼均勻。

2

給你的 「PeripheralAccessor」 的隱式轉換操作符INT:

operator int() const; 
相關問題