2013-06-05 96 views
0

我有一個類有一個私有的unsigned char *到數據緩衝區。數據緩衝區可以是可變長度的,所以我使用malloc()和free()來分配我需要保存數據的內存量。C++私有數組訪問

我的問題是,我有另一類需要訪問這些數據。我現在這樣做的方式是創建緩衝區的工作副本並將其傳遞給其他類。也就是說,我有一個函數get_data(unsigned char * copy,int size),它將大小字節複製到由副本指定的緩衝區中。緩衝區很小(約50字節),但我必須在我的程序過程中做到這一點。因此,我正在尋找一種可以讓我更加精簡的方式。

有沒有一種方法可以將數據緩衝區指針傳遞給任何其他類?他們能夠覆蓋緩衝區中的數據嗎?我知道我可以發回數據緩衝區指針的const副本,但調用者可以隨後調用const_cast並隨意修改它。也就是說,他們可以調用const_cast,然後沿着buf_ptr [2] = 0xFF;

在此先感謝您的幫助。我希望有一種方法可以在沒有調用者的可能性的情況下使用指針來破壞數據,如果他們做了一些令人討厭的事情。

+0

如果有人正在使用const_cast,它們會比可能修改數組中某些值的問題更大。 – supersam654

+0

const_cast應該幾乎從不使用,除非您將結果傳遞給不修改內容的函數。如果程序員const_char你的緩衝區,那麼他應該不會感到驚訝的東西崩潰。除非你有安全問題,否則我會選擇共享一個const unsigned char * –

+0

感謝您對const_cast的所有保證。我基本上是從代碼審查/魔鬼倡導者的角度來看待這個問題。 –

回答

2

只需提供一個const unsigned char *訪問:

const unsigned char * MyClass::get_buffer() const { return m_private_buffer; } 

當然,也有一個機會,有人使用緩衝可能決定const_cast並修改它,但是這不是你的問題。那是他們做一些他們知道調皮的事情。事實上,如果你是編寫所有代碼的人,那麼爲什麼你會試圖打破它?

+0

謝謝!這就是我的想法,我只是想讓人放心,我不應該擔心const_cast和所有那些東西。 –

+0

規則是你不必從不好的程序員保護你的代碼! =) – paddy

0

有處理這兩種方式:

  1. 使用std::shared_ptr的數據。
  2. 對數據使用std::vector<char>

然後創建一個「getter」函數,它返回共享指針(在第一種情況下)或對矢量的引用(在第二種情況下)。如果您不希望調用者修改數據,則可以將返回值const

0

我寧願只返回像提到的稻穀const unsigned char *。但另一種選擇是讓他們訪問數組中的單個元素並使用索引。例如:

unsigned char get_data(size_t index) const 
{ 
    // you can even put a bounds check in here if you want 
    return m_private_buffer[index]; 
} 

或者您可能爲此重載operator[]

0

這裏有兩種解決方案,這兩個簡單的和將工作:

1)只使用了單個陣列的經典getter和setter方法。所以你通過訪問get(0),get(1)等來遍歷一個數組。設置工作方式相同。問題是,它會有函數調用的開銷(除非它可能是一個內聯函數?可能會非常優化),並且您還必須大量重構使用該陣列的程序。

或者簡單地說

2)有東西返回指向數組的指針。私人數據仍然可以使用指針進行修改。所以簡單地返回一個指向數組的指針,然後其他所有內容(設置和檢索元素)將會快速簡單。

所以,如果你想讓數組可以被其他函數修改,指針將是你最好的選擇。如果沒有,那麼一個簡單的「get」操作符,聲明內聯速度,並且如果你感覺如此傾向,可能會重載[]操作符,會很好地工作。