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

关于模板和继承解决方案

2012-06-05 
关于模板和继承前辈们帮我看个程序文件“LinearArray.htemplatetypename Tclass Array{protected:T * da

关于模板和继承
前辈们帮我看个程序
文件“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


[解决办法]
模板类的定义和实现不要分离
[解决办法]
//已经改好了自己看吧

C/C++ code
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 总之运行没错 至于程序逻辑有没有错就不知道了 //自己对照改一下   //校园网很卡了 网页刷不开了  楼主自己多参考参考吧 我只能帮到这儿了//晚安 

热点排行