现在的位置: 首页 > 综合 > 正文

关于CArray

2013年02月05日 ⁄ 综合 ⁄ 共 1148字 ⁄ 字号 评论关闭

CArray在afxtemp.h中定义和实现。
CArray比较重要的一个函数是SetSize。
CArray维护的数据有:数组的起始地址(TYPE*)、数组已存入的元素的个数、数组能容纳的元素的个数、数组增长的步长(当数组存满元素时需要开辟新的空间,空间的大小受步长的影响,这个参数比较重要)。
CArray存入的是对象的拷贝,不应该存放指针。

//// test code here  vc++8.0

class  BlueskyBlock
{
public:
 BlueskyBlock( ) : m_data(0)
 {

 }

 BlueskyBlock( int nData ) : m_data(nData)
 {

 }

 ~BlueskyBlock( )
 {
  m_data = 0;
 }

 int  GetData( )
 {
  return m_data;
 }

protected:
private:
 int  m_data;
};

///使用片断1  CArray存放对象的拷贝
 CArray<BlueskyBlock, BlueskyBlock>  test_array;
 BlueskyBlock  one_bluesky(1), two(2), three(3);
 test_array.Add( one_bluesky );
 test_array.Add( two);
 test_array.Add( three );

 CArray<BlueskyBlock, BlueskyBlock> test_array2;
 test_array2.Copy( test_array ); // CObject不提供operator=和拷贝函数的实现
 test_array2.Append( test_array ); // 追加一个数组的内容
 for ( int nPos = 0; nPos < test_array2.GetSize(); nPos ++ )
 {
  cout << test_array2.GetAt(nPos).GetData() << endl;
 }

///使用片断2  CArray不应该存放指针
 {
  CArray< BlueskyBlock*, BlueskyBlock* >  test_array;

  // 不应该这样用!这样在test_array销毁时并不会把这两个堆对象释放掉
  // 如果要存指针,可以用CPtrArray
  test_array.Add( new BlueskyBlock(1) );
  test_array.Add( new BlueskyBlock(2) );

  for ( int nPos = 0; nPos < test_array.GetSize(); nPos ++ )
  {
   cout << test_array.GetAt(nPos)->GetData() << endl; // output ok
  }

 }

抱歉!评论已关闭.