请大家帮忙修改一下代码

ericming200409 2009-07-18 01:02:04
array.h中
//抽象数组的声明
#ifndef ARRAY
#define ARRAY

#include<iostream>
using namespace std;

template <class T> class Array
{
public:
Array(int size); //构造函数,默认构造十个元素的数组
Array(const Array<T> &); // 复制构造函数
~Array() {delete element;} //析构函数
int Length()const {return size;} //获取数组大小
T& operator [](int i) const; //用下标访问数组元素
Array<T> & operator =(const Array<T> &); //复制数组
void Resize(int i); //重置数组大小
private:
T *element;
int size;
};

#endif

array.cpp中

// 抽象数组的实现
#include "array.h"
// 构造函数
template <class T> Array<T>::Array(int sz=10)
{
if (sz<=0){cerr<<"invalid size"<<endl;return;}
element=new T[sz];
if(NULL!=element)
size=sz;
else
{
cerr<<"memory allocation error"<<endl;
return;
}

}

//复制构造函数
template<class T> Array<T>::Array(const Array<T> & a)
{
size=a.size;
element=new T[size];
if(NULL==element)
{
cerr<<"memory allocation error"<<endl;
return;
}
for(int i=0;i!=size;i++)
{
element[i]=a[i];
}
}

//重载下标访问运算符
template<class T> T& Array<T>::operator [](int i) const
{
return element[i];
}

//复制数组
template<class T> Array<T>& Array<T>::operator =(const Array<T> &a)
{
if(size!=a.size)
{
size=a.size;
delete[] element;
element=new T[size];
if(NULL==element)
{
cerr<<"memory allocation error"<<endl;
return;//**********
}
}
for(int i=0;i!=size;i++)
{
element[i]=a[i];
}
return *this;
}

//重置数组大小
template<class T> void Array<T>:: Resize(int i)
{
if(size!=i)
{

T* NewElement=new T[i];
if(NULL==NewElement)
{
cerr<<""<<endl;
return;
}
int j=i<size? i:size;
while(j--) NewElement[j]=element[j];
delete[] element;
element=NewElement;
size=i;
}
}

main.cpp中
#include"array.h"
#include<iostream>
using namespace std;
int main()
{
Array <char> MyArray(20);
cout<<MyArray.Length()<<endl;



system("pause");
return 0;
}
上面程序编译提示 : [Linker error] undefined reference to `Array<char>::Array(int)
另外大家觉得哪里有不合理的地方,可有更好的实现也尽量说出来,不胜感激
...全文
99 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ericming200409 2009-07-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 lori227 的回复:]
C/C++ code
delete[] element;
[/Quote]
这句怎么拉?
ysysbaobei 2009-07-19
  • 打赏
  • 举报
回复
定下
lori227 2009-07-19
  • 打赏
  • 举报
回复

delete[] element;
lori227 2009-07-19
  • 打赏
  • 举报
回复

delete element[];

davidxbc 2009-07-18
  • 打赏
  • 举报
回复
楼上所说正确
windsting 2009-07-18
  • 打赏
  • 举报
回复
有两种方法解决你这个问题,一种是把实现也放到头文件中,这种方法简单,

另一种方法是手动的实例化模板 Array <char>,
你在array.cpp里,写一行:

Array<char> instance;

再编译链接,应该就好了。

错误的原因是编译器编译 array.cpp 的时候,并不知道去实例化一个 Array<char> 出来,
但它需要用到这个东西(main里定义对象)的时候,又不知道该怎么去实例化它,
因为不同的编译单元是互相不知情的。

第一种方法更常见,建议你也用这种方案。
第二种方法的好处是:
只要挑选出需要实例化的那些模板,手动实例化他们,可以节约编译时间。
但是在项目小的时候,这并不会节约很多时间,而项目大的时候,
查找“需要针对那些类型实例化”这件事本身就很复杂。

希望你看明白了。
adventurelw 2009-07-18
  • 打赏
  • 举报
回复
恩,将成员函数的实现放到.h中。
cjren 2009-07-18
  • 打赏
  • 举报
回复
你尝试将cpp中的代码都copy到h中,不知是否是因为template的原因,需要将实现放在头文件中。

64,646

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧