2010-10-20 41 views
1

這是問題所在。我寫了這個函數來返回一個對成員向量的i元素的引用,所以這個元素可以被編輯。下面是代碼:如何編寫一個返回對成員對象引用的const訪問器,以便它可以被編輯?

Letter& Literal::get (int i) const { 

    return lit_m.at (i); //Vector of Letter objects 
} 

但G ++不會讓我這個元素賦值給一個非const引用:

g++ -o literal.o -c literal.cpp 
literal.cpp: In member function ‘Letter& Literal::get(int) const’: 
literal.cpp:34: error: invalid initialization of reference of type ‘Letter&’ from expression of type ‘const Letter’ 

怎麼可能解決呢?我的想法是建立一個像vector的at()函數那樣的函數,所以它會是const的,因爲它不會編輯對象本身,但是它應該讓我編輯返回的對象......可能嗎?

解決:我只是重載函數:),所以聲明一個const和一個非const版本。我擔心const和non-const重載是不允許的,但是我看到const改變了參數列表,使得它成爲可能。

回答

5

問題是這樣的成員函數:

Letter& get (int i) const 

你宣佈爲const,並且因爲,Vector類的

const T& at() const 

成員函數被調用時,返回你常量參考第i項,因此您不能修改它。

如果您確實需要修改該元素,請不要將您的get()函數聲明爲const,並像現在一樣返回對元素的引用。

順便說一下,您聲明瞭函數const,並且您返回的是非const引用。

0

這不是常量正確的。你正在改變這個類的成員變量(矢量),所以g ++將這看作是一個錯誤。當您將方法聲明爲const並返回成員變量時,期望返回的值用於inspection而不是mutation

2

有一個非常好的理由爲什麼會產生錯誤。你的班級的目標應該是不變的以保持其狀態。當你返回一個內部變量的引用時,你允許某人改變該內部變量的值,從而改變對象的狀態,使其不再是一個常量函數。

一些可能的情況是,如果Literal類包含指向Letter對象而不是字母對象的指針向量,則可以成功地將ponter返回給其中一個Letter對象,而不會出現問題。

Letter* Literal::get (int i) const { 
    return lit_m.at (i); //Vector of pointers to Letter objects 
} 

大概的文章大家處理指針應閱讀(或任何語言允許const關鍵字,但10倍以上,所以如果指針都參與)可以發現here。老實說,我可能應該再看一遍自己。

+0

其實你已經給他解決方案。只要指針永遠不會爲NULL,您可以對其進行解引用。 – CashCow 2010-10-20 15:52:37

+0

我不確定它是否有效,因爲我在考慮它是否是一個const方法,它可能實際上會返回'Letter * const'或'const Letter *',而在第二種情況下,他會處於相同的狀態像以前一樣。 – Anthony 2010-10-20 15:54:17

相關問題