2017-08-25 164 views
2

我有一個CStringArray,我想對它打電話CString::MakeUpper(),你知道的,大寫。CStringArray :: GetAt(int index)返回一個常量。爲什麼?

我想這樣的:

mycstringarray.GetAt(0).MakeUpper(); 

其中mycstringarray被宣佈是這樣的:

CStringArray mycstringarray; 
mycstringarray.SetSize(46); 
mycstringarray.setAt(0,CString("StayClassySandiego")) 

但Visual Studio中抱怨說,它不能this指針轉換從const CString&

我得到的那個不能在const上執行非const函數,但爲什麼GetAt()返回一個const?更重要的是,如果const的返回確實是由設計決定的並且不會被混淆,我該如何執行這個操作?

+1

_but爲什麼GetAt()返回一個const?_因爲有人決定這樣做。 – muXXmit2X

+0

查看[GetAt](https://msdn.microsoft.com/en-us/library/aa314338(v = vs.60).aspx)的文檔,我可以看到它返回'TCHAR',它或者是' wchar_t'或'char'。你如何設法用點來調用一個函數? – teivaz

+0

GetAt返回定義位置處的字符副本。所以你不能通過使用GetAt來修改字符串。這就是爲什麼它是常量。返回類型TCHAR可能是一個char或wchar_t,它是一個平凡的類型,並沒有任何成員函數。您只能在完整的字符串上調用MakeUpper()。 – lars

回答

3

那麼,這是因爲如何界定CStringArray(或更準確地說CObArray)的界面。它返回一個const對底層元素的引用。而MakeUpper只能在非const對象上調用,因爲它直接對對象進行修改。

如果要更改索引位置的值,請​​使用[]運算符或ElementAt()方法。

+0

啊,所以GetAt()只適合查看數據,而不是修改它調用GetData()嗎? – user3064874

+1

@ user3064874就像他說的那樣,或者像'mycstringarray [0] .MakeUpper();' – acraig5075

+0

那樣的'[]'很好。這確實解決了我的問題並改變了我的方法。 – user3064874

1

按照MSDN doc for CStringArray::GetAt,該方法的原型爲:

CString GetAt(INT_PTR nIndex) const; 

在另一方面,我spelunked內部<afxcoll.h>和(至少在VS2015)它包含此聲明:

const CString& GetAt(INT_PTR nIndex) const; 

因此,MSDN文檔和Visual Studio附帶的實際代碼之間存在不匹配。當然,實際編制的是後者,所以我們來關注這個。

CStringArray::GetAt返回常量引用原來的CString,你不能修改它因const

但是,如果你想修改到位存儲在數組中的元素,你可以使用ElementAt方法,其聲明如下:

CString& ElementAt(INT_PTR nIndex); 

換句話說,這代碼應工作:

yourStringArray.ElementAt(0).MakeUpper(); 

還有的operator[]過載,只是在它的實現調用ElementAt 。所以yourStringArray[0].MakeUpper();也應該工作。


P.S.我想補充一點,在現代C++代碼中,您可能要考慮標準容器類,如std::vector,而不是這些舊的MFC容器。

請注意,std::vector適用於CString類,因此您可以考慮在代碼中使用vector<CString>

+0

你「spelunking」非常感謝。我一定會考慮離開我的舊MFC容器。我正忙於遷移某人的Visual Studio 1998代碼,所以這將被添加到待辦事項列表中。 – user3064874

相關問題