2011-10-25 57 views
2

我有本地C++包含以下SrcClass類:C++參數是一個指向常量對象的指針,但不更新對象嗎?

std::vector<shotEntry> objectsQueue; 

bool getRelatedEntry(const entryToProcess *entriesDeets, int &i) const { 
    if (i >= (int)objectsQueue.size()) { 
     i = 0; 
     return false;} 
    if (!objectsQueue.size()) return false; 
    entriesDeets = &(objectsQueue[i++]); 
    return true; 
} 

在我的客戶,我有:

const entryToProcess *entriesDeets = NULL; 
int i = 0; 
while (srcObj->getRelatedEntry(entriesDeets, i)) { 

當我通過getRelatedEntry形式參數步驟,entriesDeets更新返回之前預期。當它返回時,客戶端的實際參數沒有更新。

這是我在兩個月後返回的一些大項目。我很確定我做的最後一次重構是引入這些該死的vectors。當我混淆標題時,需要很長時間才能編譯。我對C#初始化一次/只讀/常量有困惑嗎?我可以逃脫客戶獲得一個只讀的原生對象嗎?

+0

你可能會有興趣用其他方法從函數中返回多個值:http://stackoverflow.com/q/321068/10077 –

+0

在向量中使用指向對象的指針時要小心。如果項目添加到矢量中,可能會發生重新分配,所有內容都將移動,並且指針將無效。 –

+0

我的代碼與用戶界面使用的任何線程完全同步。我從字面上只是抓住指針,將其更新爲屏幕然後丟棄它。 – John

回答

3

這是因爲您正在設置函數參數的值。你想:

bool getRelatedEntry(const entryToProcess **entriesDeets, int &i) const { 
    ... 
    *entriesDeets = &(objectsQueue[i++]); 
    ... 

srcObj->getRelatedEntry(&entriesDeets, i) 
+0

我以爲是,謝謝。 – John

+0

或者像Benamin Lindley說的那樣,對一個指針的引用:「bool getRelatedEntry(const entryToProcess *&entriesDeets,int&i)const {'並且不需要其他更改。 – bames53

+0

但'**'比'*&'更具可讀性,您可能需要了解關聯性。 – John

3

entriesDeets是getRelatedEntry中的局部變量。你只修改本地,你沒有影響傳入的值。你需要傳遞一個指針或指針指針。

2

指針被更新,但它裏面的函數內部副本。如果你想這種變化應該是函數的外部可見,你應該通過一個參考:

//           v 
bool getRelatedEntry(const entryToProcess *&entriesDeets, int &i) const { 

或者採用C風格的雙指針,並取消對它的引用內部在每次使用:

//           v 
bool getRelatedEntry(const entryToProcess **entriesDeets, int &i) const { 
    // ... 
    *entriesDeets = &(objectsQueue[i++]); 
相關問題