我有一个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
返回对原始CString
的const 引用,并且由于const
,您无法修改它。
但是,如果您确实想就地修改存储在数组中的元素,则可以使用ElementAt
方法,该方法的声明如下:
CString& ElementAt(INT_PTR nIndex);
换句话说,此代码应该有效:
yourStringArray.ElementAt(0).MakeUpper();
还有一个重载operator[]
,只是在其实现中调用ElementAt
。所以yourStringArray[0].MakeUpper();
也应该有效。
附言我想补充一点,在现代C++代码中,您可能需要考虑标准容器类,如std::vector
,而不是这些旧的 MFC 容器。
请注意,std::vector
与CString
类配合得很好,因此您可以考虑在代码中加入vector<CString>
。