首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++初学者 求指教

2012-07-19 
C++菜鸟 求指教 高手请进完成一个数组类,模仿MFC中的类CArray的接口.要求写成模板类,模板参数写成一个就行

C++菜鸟 求指教 高手请进
完成一个数组类,模仿MFC中的类CArray的接口.要求写成模板类,模板参数写成一个就行。
拥有以下几个操作:
  获得元素数量
  判断是否为空
  删除所有元素
  获得某一下标元素
  在末尾添加1个元素
  在某个位置插入1个元素
  删除某个位置的1个元素
要求:
  内存要动态分配并使用new,delete进行分配,释放
  完成类以后要做一个简单的测试例子,对操作函数进行测试

题目如上,我的基础几乎为零,所有代码是看完课本后自己敲的,可是就是出不来结果,希望大家帮帮忙,谢啦~~(代码如下)#include<iostream>
using namespace std;
template <class T>
class TArray
{
public:
 TArray(int s = 0);
 ~TArray();
 void insert(int nPos, const T& t);
 void insert_back(const T& t);
 int Get_Num() const
 {
  return m_nPos;
 }
 int Get_Size() const
 {
  return m_nSize;
 }
 T Get_item(int i) const;
 void delete_all();
 void delete_item(int i);
 void print();
 int resize(int length);
private:
 int m_nSize;
 int m_nPos;
 T* m_ptr;
};
template<class T>
TArray<T>::TArray(int s)
{
 m_nPos=0;
 m_nSize=s;
 m_ptr = NULL;
 if (m_nSize > 0)
  m_ptr=new T[m_nSize];
}
 
template<class T>
TArray<T>::~TArray()
{
 if (m_ptr!=NULL)
  delete []m_ptr;
}
 
template<class T>
void TArray<T>::print()
{
 cout<<"Array:(";
 for(int i=0;i<m_nPos;i++)
 {
  cout<<m_ptr[i];
  if(i<m_nPos-1)
  cout<<",";  
 }
 cout<<")"<<endl;
}

template<class T>
int TArray<T>::resize(int length)//有问题,需要改
{
 T * p1;
 p1=new T[length];
 for(int i=0;i<m_nSize;i++)
  p1[i]=m_ptr[i]; 
 if(m_ptr!=NULL)
  delete []m_ptr;
 m_ptr=p1;
 m_nSize = length;
 return length;
}
template<class T>
void TArray<T>::delete_all()

 m_nPos = 0; 
 m_nSize = 0;
 //if (m_ptr!=NULL)
  //delete []m_ptr;
}
template<class T>
void TArray<T>::delete_item(int i)
{
 if (i>=m_nPos)
 {
  return ;
 }
 else
 {
  for(int j=i;j<m_nPos;j++)
  {
  m_ptr[j]=m_ptr[j+1];
  }
  m_nPos--;
 }
 
}

template<class T>
T TArray<T>::Get_item(int i) const
{
 return m_ptr[i];
}
template<class T>
void TArray<T>::insert(int nPos, const T& t)//需修改
{
 m_nPos++;
 if (nPos>=m_nPos||m_nPos>m_nSize)
 {
  int nNewSize = m_nSize*2;
  if (nNewSize<1)
  {
  nNewSize=1;
  }
  resize(nNewSize);
  for(int j=m_nPos;j>nPos;j--)
  m_ptr[j]=m_ptr[j-1];
 }
 else
 { 
  for(int j=m_nPos;j>nPos;j--)
  m_ptr[j]=m_ptr[j-1];  
 }
 m_ptr[nPos]=t; 
}
 
template<class T>
void TArray<T>::insert_back(const T& t)
{
 insert(m_nPos, t);
}

  
void main()

 int len,length,num; 
 cin>>len;
 TArray<int>A(len);
 num=A.Get_Size();
 cout<<"数组A的信息如下:\n";
 for( int i=0;i<len;i++)
 {
  A.insert(i,i*10);  
 }
 A.print();
 if(len>=num)
 {


  cout<<"please input the length of array you want:";
  cin>>length;  
 } 
 if(len!=length)
 {
  A.resize(length);
  for( int i=len;i<length;i++)
  {
  A.insert(i,i*10);  
  }
  A.print();
 }
 A.insert_back(123);
 A.print(); 
 cout<<"下标为3的元素的值是:";
 A.Get_item(3);
 cout<<"删除下标为3的元素后:\n";
 A.delete_item(3);
 A.print();
 cout<<"在第一个元素之前插入元素后:\n";
 A.insert(1,5);
 A.print();
 cout<<"元素全部删除后:\n";
 A.delete_all(); 
 A.print();
 system("pause");
}



[解决办法]
最大的问题是insertXXX方法插入的是引用数据,这样会导致TArray<T>类中m_ptr里的数据都是非法的,比较危险。这里没必把参数定义为常量引用类型。

热点排行