始めまして。hassyと申します。MFC利用、VC++6.0の環境です。
現在処理の中で
typedef CTypedPtrList<CObList, VALUE*> ValueList;を使って
ValueList *m_pValueList;
ValueList m_SeqValueList;
-- 省略 --
int iCount;
POSITION pos;
VALUE *pValue;
m_pValueList = &m_SeqValueList;
iCount = (int)m_pValueList->GetCount( );
pos = m_pValueList->GetHeadPosition();
pos = m_pValueList->GetAt((POSITION)0);
for( int i=0; i<iCount; i++ ){
pValue = m_pValueList->GetNext( pos );
delete pValue;
}
m_pValueList->RemoveAll();
という処理をしているのですが、ListではなくCtypedArrayにした場合は、
上記の処理をどう書き換えればいいのでしょうか?
変な質問で申し訳ありませんが、よろしくお願いします。
なんだかよくわからないですが、CArrayのリファレンスは読まれましたか?
CTypedPtrArrayも使い方は同じですよ。
それと、載せてもらったコードですがちょっと理解できません。
>m_pValueList;
を使う意味は?
> ValueList *m_pValueList;
> ValueList m_SeqValueList;
はどこに記述していますか?m_とつく以上メンバ変数でしょうか?
>CTypedPtrList<CObList, VALUE*>
ポインタならばCObListではなくCPtrListのほうでは?
>iCount = (int)m_pValueList->GetCount( );
全体のアイテム数を取得しなくてもposがNULLになるかみればいいです。
>pos = m_pValueList->GetAt((POSITION)0);
はどういう意味でしょうか?
0番目のposをとるという意味ではないですけど。
typedef CTypedPtrList<CPtrList, VALUE*> ValueList;
ValueList m_SeqValueList;
// すべての要素を削除する
POSITION pos = m_SeqValueList.GetHeadPosition();
VALUE* pValue;
while (pos)
{
pValue = m_SeqValueList.GetNext(pos);
delete pValue;
}
m_SeqValueList.RemoveAll();
説明が足らず、申し訳ありません。
>m_pValueList;
デストラクタクラスなので、m_pValueList内にあるp_Valueを
全て削除したいのです。
>> ValueList *m_pValueList;
>> ValueList m_SeqValueList;
>はどこに記述していますか?m_とつく以上メンバ変数でしょうか?
ヘッダファイルに記述していて、メンバ変数です。
>> CTypedPtrList<CObList, VALUE*>
>ポインタならばCObListではなくCPtrListのほうでは?
確かにそうですが、
この部分をCTypedPtrList<CObList, VALUE*>から
CTypedPtrArray<CobArray,VALUE*>に変更した場合に、
どう変更すればいいのでしょうか。
>iCount = (int)m_pValueList->GetCount( );
全体のアイテム数を取得しなくてもposがNULLになるかみればいいです。
>>pos = m_pValueList->GetAt((POSITION)0);
>はどういう意味でしょうか?
>0番目のposをとるという意味ではないですけど。
申し訳ありません。この部分は要らない部分です。
上記の内容だと、わかりづらいので再度ソースコードを張らせて貰います。
--Header--
typedef CTypedPtrList<CObList, VALUE*> ValueList;
ValueList *m_pValueList;
ValueList m_SeqValueList;
--CPP--
CItemInfo::CItemInfo(){
m_pValueList = &m_SeqValueList;
}
CItemInfo::~CItemInfo(){
int iCount;
POSITION pos;
VALUE *pValue;
m_pValueList = &m_SeqValueList;
iCount = (int)m_pValueList->GetCount( );
pos = m_pValueList->GetHeadPosition( );
for( int i=0; i<iCount; i++ ){
pValue = m_pValueList->GetNext( pos );
delete pValue;
}
m_pValueList->RemoveAll();
}
m_pValueList内にあるpValueを削除していく処理なのですが、typedefで
記述されている部分CTypedPtrList<CObList, VALUE*> ValueList;を
CTypedPtrArray<CObArray, VALUE*> ValueArray;に変更した場合に、
上記のソースをどのように変更すればいいのでしょうか?
再度、CArrayのリファレンスは読まれましたか?
CArrayは基本的に普通の配列のようにインデックスでアクセスできます。
POSITIONのようなものはありません。
ですので単純に GetSize までインクリメントして、GetAtやoperator[]で
値を取得していくだけです。
>>m_pValueList;
>デストラクタクラスなので、m_pValueList内にあるp_Valueを
>全て削除したいのです。
ナニいっているのか理解できません。
とりあえず、提示されたコードをレビューしたとき、
私ならこう直せと指摘する。
--Header--
//typedef CTypedPtrList<CObList, VALUE*> ValueList; // CPtrListにすべき
typedef CTypedPtrList<CPtrList, VALUE*> ValueList;
//ValueList *m_pValueList; // 必要なんでしょうか?
ValueList m_SeqValueList;
--CPP--
CItemInfo::CItemInfo(){
//m_pValueList = &m_SeqValueList; // 必要なんでしょうか?
}
CItemInfo::~CItemInfo(){
//int iCount; // posでみるからイネラ
POSITION pos;
VALUE *pValue;
//m_pValueList = &m_SeqValueList; // 必要なんでしょうか?
//iCount = (int)m_pValueList->GetCount( ); // posでみるからイネラ
pos = m_pValueList->GetHeadPosition( );
//for( int i=0; i<iCount; i++ ){ // posでみるからwhileへ変更
while (pos)
pValue = m_pValueList->GetNext( pos );
delete pValue;
}
m_pValueList->RemoveAll();
}
訂正)
--Header--
//typedef CTypedPtrList<CObList, VALUE*> ValueList; // CPtrListにすべき
typedef CTypedPtrList<CPtrList, VALUE*> ValueList;
//ValueList *m_pValueList; // 必要なんでしょうか?
ValueList m_SeqValueList;
--CPP--
CItemInfo::CItemInfo(){
//m_pValueList = &m_SeqValueList; // 必要なんでしょうか?
}
CItemInfo::~CItemInfo(){
//int iCount; // posでみるからイネラ
POSITION pos;
VALUE *pValue;
//m_pValueList = &m_SeqValueList; // 必要なんでしょうか?
//iCount = (int)m_pValueList->GetCount( ); // posでみるからイネラ
pos = m_SeqValueList.GetHeadPosition( );
//for( int i=0; i<iCount; i++ ){ // posでみるからwhileへ変更
while (pos)
pValue = m_SeqValueList.GetNext( pos );
delete pValue;
}
m_SeqValueList.RemoveAll();
}
> 再度、CArrayのリファレンスは読まれましたか?
リファレンスを読んだ所、CArrayとCTypedPtrArrayも同じでした。
ありがとうございます。
> CArrayは基本的に普通の配列のようにインデックスでアクセスできます。
> POSITIONのようなものはありません。
> ですので単純に GetSize までインクリメントして、GetAtやoperator[]で
> 値を取得していくだけです。
ありがとうございます。別物だとばっかり思っていたので、CArrayと同じだった
とは・・・今度からリファレンスしっかり読むようにします。
ありがとうございました。