CStringArray :: GetAt(int index)返回一个const。为什么?

时间:2017-08-25 10:15:11

标签: c++ arrays string visual-studio mfc

我有一个CStringArray,我想打电话给CString::MakeUpper(),你知道,它是大写的。

我试着这样:

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的返回确实是设计而不是搞乱,我怎么能执行这个操作呢?

2 个答案:

答案 0 :(得分:3)

那是因为CStringArray(或者更确切地说是CObArray)的界面是如何定义的。它返回对基础元素的const引用。并且MakeUpper只能在非const对象上调用,因为它直接对该对象进行操作。

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

答案 1 :(得分:1)

根据MSDN doc for CStringArray::GetAt,这种方法的原型是:

CString GetAt( INT_PTR nIndex ) const;

另一方面,我在<afxcoll.h>内部进行了探讨,并且(至少在VS2015中)它包含了这个声明:

const CString& GetAt(INT_PTR nIndex) const;

因此,MSDN文档与Visual Studio附带的实际代码之间存在不匹配。当然,实际编译的是后者,所以让我们关注这一点。

CStringArray::GetAt会将 const引用返回到原始CString,由于const,您无法对其进行修改。

但是,如果您确实希望修改放置存储在数组中的元素,则可以使用 ElementAt 方法,该方法声明为:

CString& ElementAt(INT_PTR nIndex);

换句话说,这段代码应该有效:

yourStringArray.ElementAt(0).MakeUpper();

还有operator[]的重载,它只在其实现中调用ElementAt。所以yourStringArray[0].MakeUpper();也应该有用。

PS 我想补充一点,在现代C ++代码中,您可能需要考虑标准容器类,例如std::vector,而不是这些旧的MFC容器。

请注意,std::vector适用于CString课程,因此您可以考虑在代码中使用vector<CString>