2009-12-20 104 views
1

我得想重載()運算符用於數組訪問時,另一個問題:C++()操作問題

const OctTreeNode*& operator()(const int i, const int j, const int k) const{ 
    return m_cells[k*m_resSqr+j*m_res+i]; 
} 

OctTreeNode*& operator()(const int i, const int j, const int k){ 
    return m_cells[k*m_resSqr+j*m_res+i];  
} 

vector<OctTreeNode*> m_cells; 

我得到一個

C2440 'return': cannot convert from 'OctTreeNode *const' to 'const OctTreeNode *&' 

這是怎麼回事?我正在像另一個班級那樣宣佈它。唯一的區別是,其他類是通用的,還有我使用牛逼&,而不是OctreeNode * &

+1

是否有返回對指針的引用而不是引用元素的原因? – pmr 2009-12-20 18:01:25

+0

...或指向成員的指針?返回const引用的想法是它可能比返回完整副本要便宜得多,但如果類型是整數或指針,它沒有多大意義。 (假設你不能將引用返回到真實對象,這將是一個更好的方法) – 2009-12-21 07:59:06

回答

2

的第一家運營商應該返回常量

const OctTreeNode * const & operator()(const int i, const int j, const int k) const{ 
     return m_cells[k*m_resSqr+j*m_res+i]; 
} 

...或者常量的*前,我從來沒有記得-_-

第一個const告訴我們,我們不能修改OctTreeNode,第二個告訴我們,我們不能修改指向它的指針(例如設置爲NULL),而第三個一個告訴我們該方法不會改變對象。

說實話,我不確定第一個是需要的,因爲我們需要授予const方法正確性的唯一方法是授予沒有人會更改對這些指針的引用。

+0

thx。但你能解釋我爲什麼嗎?爲什麼然後http://www.parashift.com/c++-faq-lite/const-correctness.html#faq-18.12中的第一個運算符返回Fred&而不是Fred? – genesys 2009-12-20 17:54:14

+0

在一個表達式中的三個常量讓我對這些常量實際上意味着什麼感到困惑 – genesys 2009-12-20 17:55:36

+0

擴展我的答案 – 2009-12-20 17:59:29

0

通過常量值傳遞沒有什麼意義,正如你對i,j,k所做的那樣。

+0

嘗試在評論中說出這些內容,因爲這不是真正問題的答案。 – pmr 2009-12-20 18:00:03

+0

對不起,還沒有真正掌握這個地方:) – James 2009-12-20 18:02:22

+0

我有時將我的值參數作爲const傳遞。這有助於我兩個原因 - 如果我錯誤地嘗試和改變它,編譯器會通知我,其次,語義更清晰。唯一的缺點是功能在視覺上更大,認知上可能需要更長時間才能理解。 – 2009-12-20 18:17:33

0

常量運算符不正確,您正在返回對常量OctTreeNode的指針的非常量引用。

也就是說,如果聲明一個指針

const int *a; 

a不是恆定的,什麼a是恆定的。所以當你聲明返回類型爲

const OctTreeNode*& 

OctTreeNode是常量,但指針不是。這是一個錯誤,因爲你的成員函數是const的,所以std :: vector是const,所以它返回的指針也是常量 - 最後你試圖返回一個const指針作爲非const指針。

要糾正這只是刪除參考

const OctTreeNode* operator() 

,因爲沒有太多的點返回引用一個常量指針,你不能修改指針和引用將(可能)有大小相同無論如何指針。

+0

「沒有太多的指針返回對常量指針的引用」接口的一致性?如果他在一種情況下返回一個指針,而在另一種情況下返回一個指向指針的指針,那麼一個版本返回一個左值,另一個返回一個右值,這會影響您是否可以執行'&this-> operator()(1,2,3)',並將結果指針與另一個類似指針進行比較。這對於提問者來說是有用的,但它是兩者之間的區別 – 2009-12-20 18:50:30

+0

這是真的,但是我的頭頂我無法想到任何有用的東西 - 如果你需要接受它的地址,可能會想要改變它。 – 2009-12-20 19:18:47

+0

那麼,你可能出於某種原因想要測試兩個對operator()的調用是否訪問過相同的元素(而不是隻訪問包含相同值的元素)。在這種情況下,當且僅當a == x && b == y&c == z時,'&foo(a,b,c)'=='&foo(x,y,z)所以還有另外一種方法可以做到這一點,如果你傳遞所有三個座標,而不是僅僅一個參考。 – 2009-12-20 21:28:18

1

Kornel是正確的。澄清const應該在*之前還是之後,之後。 const OctTreeNode * const &OctTreeNode const * const &這兩種類型是相同的,從右至左閱讀時都很容易理解。

const OctTreeNode * const &是一個常量指向OctTreeNode的常量的引用。

OctTreeNode const * const &是對常量OctTreeNode的const指針的引用。

請注意,這些類型與無效類型const OctTreeNode const * &不同。這將是一個指向const的常量OctTreeNode的指針。

注意句子的最後部分常量OctTreeNode是const。其中一個常量是多餘的,如果它是合法的,這種類型將相當於const const OctTreeNode * &