TKHと申します。
いつも参考にさせてもらっております。
CArrayのn番目要素のアドレスを取得保存し、
別なところでそのアドレスが指している要素を参照したいのですが、
どのようにすればよいのでしょうか?
例えば
CArray<CMyData, CMyData&> m_MyDataArray;
CMyData* pMyData = &m_MyDataArray[n];
CMyData* pMyData = &m_MyDataArray.GetAt(n);
とした場合、取得できたアドレスは一時的な参照へのアドレス値
となってしまいます。
また、アドレスを取得が取得できた場合
CArray::SetSize()や拡張・挿入・削除などの操作を行った場合、
取得したアドレス(n番目の要素)は不変なのでしょうか?
ご教授お願いします。
CArray::GetData()で最初の要素へのポインタが得られますから、n番目の要素は:
CMyData* pMyData = m_MyDataArray.GetDate() + n;
> CArray::SetSize()や拡張・挿入・削除などの操作を行った場合、
> 取得したアドレス(n番目の要素)は不変なのでしょうか?
NO.
επιστημηさん、ありがとうございます。
引き続きの質問、お願いします。
取得したアドレス(n番目の要素)の変化する件ですが、
以下の場合も変化するのでしょうか?
(1) SetAtGrow(),Add(),Append()
(2) n番目以降の要素の InsertAt(),RemoveAt()
(3) CArrayをvectorに置き換えた場合の同様な操作の場合。
要素のアドレスを取得保存し、その後参照するような操作は、
CArrayでは基本的に行うべきではないのでしょうか?
ご教授お願いします。
> 取得したアドレス(n番目の要素)の変化する件ですが、
> 以下の場合も変化するのでしょうか?
> ...
どれもこれも、やってみれば明らかです。
> 要素のアドレスを取得保存し、その後参照するような操作は、
> CArrayでは基本的に行うべきではないのでしょうか?
case-by-caseでしょう。
挿入/削除を伴わない操作ではポインタに変化がないのですから。
>(1) SetAtGrow(),Add(),Append()
変化する可能性はあります。
>(2) n番目以降の要素の InsertAt(),RemoveAt()
InsertAtでは変化する可能性はあります。
RemoveAtでは変化しません
>(3) CArrayをvectorに置き換えた場合の同様な操作の場合。
同様に変化すると思われます。
>要素のアドレスを取得保存し、その後参照するような操作は、
>CArrayでは基本的に行うべきではないのでしょうか?
ポインタの配列を使用すれば、管理の手間は増えますが、
これらの問題を回避できるでしょう。
CArrayの要素アドレスを取得保存するというのは、
何かと問題が発生しそうなので、別の方法を探ってみます。
ありがとうございました。