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



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

我正在尝试这样做:

mycstringarray.GetAt(0).MakeUpper();

其中mycstringarray是这样声明的:

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

但Visual Studio抱怨它无法将指针从const CString转换为&this

我知道不能在常量上执行非常量函数,但为什么GetAt()返回常量?更重要的是,如果 const 的返回确实是设计使然并且不被弄乱,我该如何执行此操作?

这是因为CStringArray(或更准确地说是CObArray(的接口是如何定义的。它返回对基础元素的const引用。MakeUpper只能在非const对象上调用,因为它直接操纵对象。

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

根据 MSDN 文档 forCStringArray::GetAt,此方法的原型是:

CString GetAt( INT_PTR nIndex ) const;

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

const CString& GetAt(INT_PTR nIndex) const;

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

CStringArray::GetAt返回对原始CStringconst 引用,并且由于const,您无法修改它。

但是,如果您确实想就地修改存储在数组中的元素,则可以使用ElementAt方法,该方法的声明如下:

CString& ElementAt(INT_PTR nIndex);

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

yourStringArray.ElementAt(0).MakeUpper();

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


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

请注意,std::vectorCString类配合得很好,因此您可以考虑在代码中加入vector<CString>

最新更新