代码: 全选
#ifndef ARRAY_H
#define ARRAY_H
template<class T>
class Array{
protected:
T* data;
unsigned int base;
unsigned int length;
public:
Array();
Array(unsigned int len,unsigned int base);
~Array();
Array(const Array& arr);
Array& operator = (const Array& arr);
T& operator [] (unsigned int index) const;
const T* Data() const;
unsigned int Base() const;
unsigned int Length() const;
void SetBase(unsigned int newbase);
void SetLength(unsigned int newlength);
void CopyTo(Array&) const;
};
template<class T>
Array<T>::Array() :
data(new T[1]),
base(0),
length(0)
{}
template<class T>
Array<T>::Array(unsigned int len,unsigned int base = 0) :
data(new T[len]),
base(base),
length(len)
{}
template<class T>
Array<T>::Array(const Array<T>& arr):
data(new T[arr.length]),
base(arr.base),
length(arr.lenth)
{
for(unsigned int i = 0; i< length;i++)
data[i] = arr.data[i];
}
template<class T>
Array<T>::~Array()
{
delete [] data;
}
template<class T>
const T* Array<T>::Data() const
{
return data;
}
template<class T>
unsigned int Array<T>::Base() const
{
return base;
}
template<class T>
unsigned int Array<T>::Length() const
{
return length;
}
template<class T>
T& Array<T>::operator [] (unsigned int index) const
{
unsigned int const offset = index - base;
if(offset >= length)
throw ("invalid array index!\n");
return data[offset];
}
template<class T>
void Array<T>::SetBase(unsigned int newbase)
{
this->base = newbase;
}
template<class T>
void Array<T>::SetLength(unsigned int newlength)
{
T* newData = new T[newlength];
unsigned int const min = length < newlength ? length : newlength;
for(unsigned int i = 0; i < min; i++)
newData[i] = data[i];
delete [] data;
data = newData;
length = newlength;
}
template<class T>
void Array<T>::CopyTo(Array<T>& array) const{
unsigned int tmp = array.Base();
array.SetBase(this->Base());
array.SetLength(this->Length());
for(unsigned int i = 0; i<this->length; i++)
array[i] = this->data[i];
array.SetBase(tmp);
}
/**
* Array2D
*/
template<class T>
class Array2D{
protected:
unsigned int numberOfRows;
unsigned int numberOfColumns;
Array<T> array;
public:
class Row{
Array2D& array2D;
unsigned int const row;
public:
Row(Array2D& _array2D,unsigned int _row) : array2D(_array2D),row(_row) {}
T& operator[] (unsigned int column) const{ return array2D.Select(row,column);}
};
Array2D(unsigned int,unsigned int);
T& Select(unsigned int,unsigned int);
Row operator[] (unsigned int);
};
template<class T>
Array2D<T>::Array2D(unsigned int m,unsigned int n) : numberOfRows(m),numberOfColumns(n),array(m*n) {}
template<class T>
T& Array2D<T>::Select(unsigned int i,unsigned int j){
if(i >= this->numberOfRows)
throw "invalid row.";
if(j >= this->numberOfColumns)
throw "invalid column.";
return array[i*this->numberOfColumns + j];
}
template<class T>
Array2D<T>::Row Array2D<T>::operator [](unsigned int row){
return Row(*this,row);
}
/**
* class Matrix
*/
template<class T>
class Matrix : public Array2D<T>{
public:
Matrix(unsigned int,unsigned int);
Matrix operator * (const Matrix&) const;
Matrix operator + (const Matrix&) const;
};
template<class T>
Matrix<T>::Matrix(unsigned int m,unsigned int n) : numberOfRows(m),numberOfColumns(n),array2D(m*n) {}
template<class T>
Matrix<T> Matrix<T>::operator * (const Matrix& arg) const{
if(this->numberOfColumns != arg.numberOfRows)
throw "incompatible matrices.";
Matrix<T> result(this->numberOfRows,arg.numberOfColumns);
for(unsigned int i = 0; i < this->numberOfRows; i++){
for(unsigned int j = 0; j < arg.numberOfColumns; j++){
T sum = 0;
for(unsigned int k = 0; k < this->numberOfColumns; k++)
sum += (*this)[i][k] * arg[k][j];
result[i][j] = sum;
}
}
return result;
}
template<class T>
Matrix<T> Matrix<T>::operator + (const Matrix& arg) const{
if(this->numberOfColumns != arg.numberOfColumns || this->numberOfRows != arg.numberOfRows)
throw "incompatible matrices.";
Matrix<T> result(this->numberOfRows,this->numberOfColumns);
for(unsigned int i = 0; i < this->numberOfRows; i++){
for(unsigned int j = 0; j < this->numberOfColumns; j++)
result[i][j] = (*this)[i][j] + arg[i][j];
}
return result;
}
#endif
代码: 全选
#include "array.h"
int main()
{
return 0;
}
代码: 全选
template<class T>
Array2D<T>::Row Array2D<T>::operator [](unsigned int row){
return Row(*this,row);
}
在这个地方
代码: 全选
Matrix<T>::Matrix(unsigned int m,unsigned int n) : numberOfRows(m),numberOfColumns(n),array2D(m*n) {}
array.h: In constructor ‘Matrix<T>::Matrix(unsigned int, unsigned int)’:
array.h:161: error: class ‘Matrix<T>’ does not have any field named ‘numberOfRows’
array.h:161: error: class ‘Matrix<T>’ does not have any field named ‘numberOfColumns’
array.h:161: error: class ‘Matrix<T>’ does not have any field named ‘array2D’
怎么看得莫名其妙的