关于模板和继承
前辈们帮我看个程序
文件“LinearArray.h"
template<typename T>
class Array{
protected:
T * data;
int total;
friend class Tools;
public:
Array();
Array(int);
Array(const Array<T>&);
void initialize(int);
void dellocate();
T operator() (int);// getter
void operator() (int,T);// setter
void operator = (const Array<T>&);
void show(int=0 , int=total-1);
void fill(T val);
int getTotal();
~Array(){
dellocate();
}
};
文件“LinearArray.cpp"
#include "LinearArray.h"
template<typename T>
Array<T>::Array()
{
//doing nothing
}
template<typename T>
Array<T>::Array(int total)
{
this->total = total;
data = new T[total];
};
template<typename T>
Array<T>::Array(const Array<T>& arr)
{
this->total = arr.getTotal();
for(int i=0; i<total ; i++)
data[i] = arr(i);
}
template<typename T>
void Array<T>::initialize(int n)
{
this->total = n;
data = new T[total];
}
template<typename T>
void Array<T>::dellocate()
{
delete[] data;
}
template<typename T>
T Array<T>::operator()(int n)
{
if(n<0 || n>=total)
return 0;
else
return data[n];
}
template<typename T>
void Array<T>::operator()(int n, T val)
{
if(n<0 || n>=total)
return;
else
data[n] = val;
}
template<typename T>
void Array<T>::operator=(const Array<T>& arr)
{
this->initialize(arr.getTotal());
for(int i=0; i<this->total;i++)
this->operator()(i,arr(i));
}
template<typename T>
void Array<T>::fill(T val)
{
for(int i=0; i<total ; i++)
{
this->operator()(i,val);
}
}
template<typename T>
void Array<T>:: show(int start=0 , int end=total-1)
{
if(start<0 || end >= total)
return;
else
{
for(int i=start ; i<= end ; i++)
{
cout<<data[i]<<"";
if(i%10==0)
cout<<endl;
}
}
}
template<typename T>
int Array<T>::getTotal()
{
return total;
}
文件 "Matrix_1D.h"
#include "LinearArray.h"
#include <string.h>
template<typename T>
class Matrix_1D : public Array<T>
{
private:
//friend class Tools
friend class Tools;
public:
Matrix_1D();
Matrix_1D(int);
Matrix_1D(const Matrix_1D<T> &);
void initialize(int);
void dellocate();
T operator()(int);//gettter
void operator()(int,T);//setter
void operator+=(const Matrix_1D<T>);
void operator-=(const Matrix_1D<T>);
void operator=(const Matrix_1D<T>);
friend Matrix_1D operator * (const Matrix_1D<T>& , const Matrix_1D<T>&);
int getTotal();
void fill(T);
void show(int=0 , int=total-1);
~Matrix_1D(){
dellocate();
delete data;
};
};
文件 "Matrix_1D.cpp"
#include"Matrix_1D.h"
template<typename T>
Matrix_1D<T>::Matrix_1D()
{
Array<T>();
}
template<typename T>
Matrix_1D<T>::Matrix_1D(int total)
{
Array<T>(total);
}
template<typename T>
Matrix_1D<T>::Matrix_1D(const Matrix_1D<T> & matrix)
{
Array();
this->data = new T[matrix.getTotal()];
for(int i=0 ; i<this->total ; i++)
{
data[i] = matrix(i);
}
}
template<typename T>
void Matrix_1D<T>::initialize(int total)
{
base->initialize(total);
}
template<typename T>
void Matrix_1D<T>::dellocate()
{
base->dellocate();
}
template<typename T>
T Matrix_1D<T>::operator()(int n)
{
return data[n];
}
template<typename T>
void Matrix_1D<T>::operator()(int n ,T val)
{
data[n] = val;
}
template<typename T>
void Matrix_1D<T>::operator+=(const Matrix_1D<T> matrix)
{
dellocate();
for(int i=0; i<total ; i++)
{
this->operator()(i,this->operator()(i)+matrix(i));
}
}
template<typename T>
void Matrix_1D<T>::operator-=(const Matrix_1D<T> matrix)
{
for(int i=0; i<total ; i++)
{
this->operator()(i,this->operator()(i)-matrix(i));
}
}
template<typename T>
void Matrix_1D<T>::operator=(const Matrix_1D<T> matrix)
{
for(int i=0; i<total ; i++)
{
this->operator()(i,matrix(i));
}
}
template<typename T>
Matrix_1D<T> operator * (const Matrix_1D<T>& matrix1 , const Matrix_1D<T>&matrix2)
{
Matrix_1D<T> matrix(matrix1.getTotal());
for(int i=0; i<total ; i++)
{
matrix(i,matrix1(i) * matrix2(i));
}
return matrix;
}
template<typename T>
int Matrix_1D<T>::getTotal()
{
return total;
}
template<typename T>
void Matrix_1D<T>::fill(T val)
{
base->fill(val);
}
template<typename T>
void Matrix_1D<T>::show(int start=0 , int end=total-1)
{
base->show(start,end);
}
前辈们帮我看下,哪错了。错误是:
Error1error C2953: 'Array' : class template has already been definedc:\users\dell\desktop\callabhistogram\callabhistogram\lineararray.h26
和
Error4error C2955: 'Array' : use of class template requires template argument listc:\users\dell\desktop\callabhistogram\callabhistogram\matrix_2d.h4
[解决办法]
模板类的定义和实现不要分离
[解决办法]
//已经改好了自己看吧
template<typename T>class Array{protected: T * data; int total; friend class Tools;public: Array(); Array(int); Array(const Array<T>&); void initialize(int); void dellocate(); T operator() (int);// getter void operator() (int,T);// setter void operator = (const Array<T>&); void show(int = 0 , int = total-1); void fill(T val); int getTotal(); ~Array() { dellocate(); }};template<typename T>Array<T>::Array(){//doing nothing}template<typename T>Array<T>::Array(int totals){ this->total = totals; data = new T[total];};template<typename T>Array<T>::Array(const Array<T>& arr){ this->total = arr.getTotal(); for(int i=0; i<total ; i++) data[i] = arr(i);}template<typename T>void Array<T>::initialize(int n){ this->total = n; data = new T[total];}template<typename T>void Array<T>::dellocate(){ delete[] data;}template<typename T>T Array<T>::operator()(int n){ if(n<0 || n>=total) return 0; else return data[n];}template<typename T>void Array<T>::operator()(int n, T val){ if(n<0 || n>=total) return; else data[n] = val;}template<typename T>void Array<T>::operator=(const Array<T>& arr){ this->initialize(arr.getTotal()); for(int i=0; i<this->total;i++) this->operator()(i,arr(i));}template<typename T>void Array<T>::fill(T val){ for(int i=0; i<total ; i++) { this->operator()(i,val); }}template<typename T>void Array<T>:: show(int start , int end )//-------------{ if(start<0 || end >= total) return; else { for(int i=start ; i<= end ; i++) { cout<<data[i]<<" "; if(i%10==0) cout<<endl; } }}template<typename T>int Array<T>::getTotal(){ return total;}#include "LinearArray.h"#include <string.h>template<typename T>class Matrix_1D : public Array<T>{private: //friend class Tools friend class Tools;public: Matrix_1D(); Matrix_1D(int); Matrix_1D(const Matrix_1D<T> &); void initialize(int); void dellocate(); T operator()(int);//gettter void operator()(int,T);//setter void operator+=(const Matrix_1D<T>); void operator-=(const Matrix_1D<T>); void operator=(const Matrix_1D<T>); friend Matrix_1D operator * (const Matrix_1D<T>& , const Matrix_1D<T>&); int getTotal(); void fill(T); void show(int=0 , int=total-1); ~Matrix_1D() { dellocate(); delete data; };};template<typename T>Matrix_1D<T>::Matrix_1D():Array()//对于继承用初始化值列表来初始化构造函数{}template<typename T>Matrix_1D<T>::Matrix_1D(int totals):Array(totals){ }template<typename T>Matrix_1D<T>::Matrix_1D(const Matrix_1D<T> & matrix){ Array(); this->data = new T[matrix.getTotal()]; for(int i=0 ; i<this->total ; i++) { data[i] = matrix(i); }}template<typename T>void Matrix_1D<T>::initialize(int totals){ Array<T>::initialize(totals); //base->initialize(totals);//base 未声明}template<typename T>void Matrix_1D<T>::dellocate(){ Array<T>::dellocate(); //base->dellocate();//--------------base 未声明}template<typename T>T Matrix_1D<T>::operator()(int n){ return data[n];}template<typename T>void Matrix_1D<T>::operator()(int n ,T val){ data[n] = val;}template<typename T>void Matrix_1D<T>::operator+=(const Matrix_1D<T> matrix){ dellocate(); for(int i=0; i<total ; i++) { this->operator()(i,this->operator()(i)+matrix(i)); }}template<typename T>void Matrix_1D<T>::operator-=(const Matrix_1D<T> matrix){ for(int i=0; i<total ; i++) { this->operator()(i,this->operator()(i)-matrix(i)); }}template<typename T>void Matrix_1D<T>::operator=(const Matrix_1D<T> matrix){ for(int i=0; i<total ; i++) { this->operator()(i,matrix(i)); }}template<typename T>Matrix_1D<T> operator * (const Matrix_1D<T>& matrix1 , const Matrix_1D<T>&matrix2){ Matrix_1D<T> matrix(matrix1.getTotal()); for(int i=0; i<total ; i++) { matrix(i,matrix1(i) * matrix2(i)); } return matrix;}template<typename T>int Matrix_1D<T>::getTotal(){ return total;}template<typename T>void Matrix_1D<T>::fill(T val){ Array<T>::fill(val); //base->fill(val);}template<typename T>void Matrix_1D<T>::show(int start , int end)//----------{ Array<T>::show(start,end);}#include "Matrix_1D.h"#include <iostream>using std::cin;using std::cout;using std::endl;int main(){ Matrix_1D<float> matrix(10); matrix.fill(1.0f); matrix.show(0,9); return 0;}//这是所有的程序了 输出一连串的1 总之运行没错 至于程序逻辑有没有错就不知道了 //自己对照改一下 //校园网很卡了 网页刷不开了 楼主自己多参考参考吧 我只能帮到这儿了//晚安