2017-08-25 28 views
2

私はCStringArrayを持っており、CString::MakeUpper()に電話して大文字にしたいと思います。CStringArray :: GetAt(int index)はconstを返します。どうして?

私はこのようにそれをしようとしている:

mycstringarray.GetAt(0).MakeUpper(); 

mycstringarrayは次のように宣言された場所:

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

が、Visual Studioは、それがconst CStringから&thisポインタを変換することができないと文句を言い。

constで非const関数を実行できないのですが、なぜGetAt()がconstを返すのですか?さらに重要なのは、constの返り値が実際に設計通りであり、混乱しない場合、この操作を実行するにはどうすればよいですか?

+1

_butなぜGetAt()はconst?_を返すのですか?誰かがそれをこのようにすることを決めたからです。 – muXXmit2X

+0

[GetAt](https://msdn.microsoft.com/en-us/library/aa314338(v=60).aspx)のドキュメントを見ると、 'TCHAR'を返すことがわかります。これは' wchar_t'または 'char'です。どのようにしてドットから関数を呼び出すことができますか? – teivaz

+0

GetAtは、定義された位置にある文字のコピーを返します。したがって、GetAtを使用して文字列を変更することはできません。だから、それはconstです。戻り値の型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; 

、私は(少なくともVS2015で)<afxcoll.h>内部spelunkedと、この宣言を含む:

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(); 

ちょうどその実装にElementAtを呼び出すoperator[]の過負荷は、もあります。したがってyourStringArray[0].MakeUpper();もうまくいくはずです。


P.S.最新のC++コードでは、これらの古いMFCコンテナの代わりに、std::vectorのような標準コンテナクラスを考慮したいと思うかもしれません。

std::vectorCStringクラスでうまくいきますので、コードにvector<CString>があると考えることができます。

+0

あなたは "spelunking"を大変感謝しています。私は間違いなく、古いMFCコンテナから離れていくことを検討しています。私はVisual Studio 1998のコードをいくつかマイグレーションしているので、これはToDoリストに追加されます。 – user3064874

関連する問題