CTypedPtrListからCTypedPtrArrayにするには

[戻る]
hassy 2007/02/14(水) 18:52:20
始めまして。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にした場合は、
上記の処理をどう書き換えればいいのでしょうか?
変な質問で申し訳ありませんが、よろしくお願いします。

Blue 2007/02/14(水) 21:22:04
なんだかよくわからないですが、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();

hassy 2007/02/15(木) 10:23:02
説明が足らず、申し訳ありません。
>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;に変更した場合に、
上記のソースをどのように変更すればいいのでしょうか?

Blue 2007/02/15(木) 10:33:01
再度、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();
}

Blue 2007/02/15(木) 10:35:24
訂正)

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

hassy 2007/02/15(木) 11:45:51
[[解決]]
> 再度、CArrayのリファレンスは読まれましたか?
リファレンスを読んだ所、CArrayとCTypedPtrArrayも同じでした。
ありがとうございます。

> CArrayは基本的に普通の配列のようにインデックスでアクセスできます。
> POSITIONのようなものはありません。
> ですので単純に GetSize までインクリメントして、GetAtやoperator[]で
> 値を取得していくだけです。
ありがとうございます。別物だとばっかり思っていたので、CArrayと同じだった
とは・・・今度からリファレンスしっかり読むようにします。
ありがとうございました。

古いスレッドには追加発言できません。