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