2011-11-25 71 views
2

我想讓我的函數返回一個對象數組。但我想對返回的引用進行一些限制,以便返回的值/引用不會被調用者修改。從函數返回const引用

class A 
{ 
    B **arrB; 

    public : 
     A() 
     { 
      initialize arrB 
     } 
     B** getB() 
     { 
      return arrB; 
     } 
} 

In above code, array returned by getB() function, should not be modified. Can someone suggest best way to do this ? Can "const" help?

+4

任何你不只是返回'vector'的理由? –

+1

'const'可以提供幫助,但是如果用戶將指針轉換爲非const指針,那麼他可以修改矢量......但是從我所知道的'const'是唯一的方法 – INS

+0

除非您有特定原因使用標準容器。也許你需要一個矢量矢量,也許你需要一個平面矢量。 – curiousguy

回答

3

Yes it will help. But then you will get an error about illegal conversion from B **const B **,但這是const_cast的原因:

const B** getB() const 
{ 
    return const_cast<const B**>(arrB); 
} 

注意,我在函數聲明之後增加了額外的const預選賽。這告訴編譯器該函數不會修改類中的任何內容。

+0

謝謝..這似乎是我在找什麼。會試試這個。 – Rahul

4

這應該這樣做:

const B * const * getB() const { return arrB; } 

編輯:添加常量,因爲成員函數不修改內容。

1

const並沒有真正的幫助。當您嘗試修改陣列時,編譯器可能會引發一些警告/錯誤,但您始終可以投射到非const指針並對其進行修改。 const更多的是給這個類的用戶一個提示:我給你的指針是隻讀的;修改它在你的危險!

1

那麼,我所看到的可能的方式是從私有文件(包含原始對象實例的副本)中複製新的數組。如果你想確保該類的私有成員沒有被改變,那麼你就不需要關心使用arrB指針副本的代碼將如何處理它。但是,當然有更多的內存使用和消費者必須刪除獲得的數組的缺點。