#《Essential C++》读书笔记# 第六章 以template…
2020-02-15 16:02:39来源:博客园 阅读 ()
#《Essential C++》读书笔记# 第六章 以template进行编程
练习题答案
练习6.1 试改写以下类,使它成为一个class template:
class example { public: example(double min, double max); example(const double* array, int size); double& operator[](int index); bool operator==(const example&) const; bool insert(const double*, int); bool insert(double); double min() const { return _min; } double max() const { return _max; } void min(double); void max(double); int count(double value) const; private: int size; double* parray; double _min; double _max; };
改写后:
template <typename elemType> class example { public: example(const elemType& min, const elemType& max); example(const elemType* array, int size); elemType& operator[](int index); bool operator==(const example&) const; bool insert(const elemType*, int); bool insert(const elemType&); elemType min() const { return _min; } elemType max() const { return _max; } void min(const elemType&); void max(const elemType&); int count(const elemType& value) const; private: int _size; elemType* _parray; elemType _min; elemType _max; };
练习6.2 重新以template形式实现练习4.3的Matrix class,并扩充其功能,使它能够通过通过heap memory(堆内存)来支持任意行列大小。分配/释放内存的操作,请在constructor/destructor中进行。
Matrix.h #ifndef MATRIX_H #define MATRIX_H #include <iostream> using namespace std; template <typename elemType> class Matrix; template <typename elemType> class Matrix { friend Matrix operator+ <elemType> (const Matrix&, const Matrix&); template <typename elemType> friend Matrix<elemType> operator* (const Matrix<elemType>&, const Matrix<elemType>&); public: Matrix(int rows, int columns); Matrix(const Matrix&); ~Matrix() { delete[] _matrix; } Matrix& operator=(const Matrix&); void operator+= (const Matrix&); elemType& operator()(int row, int column) { return _matrix[row * cols() + column]; } const elemType& operator()(int row, int column) const { return _matrix[row * cols() + column]; } int rows() const { return _rows; } int cols() const { return _cols; } bool same_size(const Matrix& m) const { return rows() == m.rows() && cols() == m.cols(); } bool comfortable(const Matrix& m) const { return (cols() == m.rows()); } ostream& print(ostream&) const; protected: int _rows; int _cols; elemType* _matrix; }; template <typename elemType> inline ostream& operator<<(ostream& os, const Matrix<elemType>& m) { return m.print(os); } template<typename elemType> Matrix<elemType> operator+(const Matrix<elemType>& m1, const Matrix<elemType>& m2) { //确定m1和m2大小相同 Matrix<elemType> result(m1); result += m2; return result; } template<typename elemType> Matrix<elemType> operator * (const Matrix<elemType>& m1, const Matrix<elemType>& m2) { //m1的行数(row)必须等于m2的列数(column) Matrix<elemType> result(m1.rows(), m2.cols()); for (int ix = 0;ix < m1.rows();++ix) { for (int jx = 0;jx < m1.cols();++jx) { result(ix, jx) = 0; for (int kx = 0;kx < m1.cols();++kx) { result(ix, jx) += m1(ix, kx) * m2(kx, jx); } } } return result; } template <typename elemType> void Matrix<elemType>::operator+=(const Matrix& m) { //确定m1和m2的大小相同 int matrix_size = cols() * rows(); for (int ix = 0;ix < matrix_size;++ix) { (*(_matrix + ix)) += (*(m._matrix + ix)); } } template <typename elemType> ostream& Matrix<elemType> ::print(ostream& os) const { int col = cols(); int matrix_size = col * rows(); for (int ix = 0;ix < matrix_size;++ix) { if (ix % col == 0) os << endl; os << (*(_matrix + ix)) << ' '; } os << endl; return os; } template <typename elemType> Matrix<elemType>& Matrix<elemType>::operator=(const Matrix& rhs) { if (this != &rhs) { _rows = rhs._rows; _cols = rhs._cols; int mat_size = _rows * _cols; delete[] _matrix; _matrix = new elemType[mat_size]; for (int ix = 0;ix < mat_size;++ix) _matrix[ix] = rhs._matrix[ix]; } return *this; } template <typename elemType> Matrix<elemType>::Matrix(int rows, int columns) :_rows(rows), _cols(columns) { int size = _rows * _cols; _matrix = new elemType[size]; for (int ix = 0;ix < size;++ix) _matrix[ix] = elemType(); } template <typename elemType> Matrix<elemType>::Matrix(const Matrix& rhs) { _rows = rhs._rows; _cols = rhs._cols; int mat_size = _rows * _cols; _matrix = new elemType[mat_size]; for (int ix = 0;ix < mat_size;++ix) _matrix[ix] = rhs._matrix[ix]; } #endif main.cpp #include "Matrix.h" #include <fstream> int main() { ofstream log("log.txt"); if (!log) { cerr << "can't open log file!\n"; return 0; } Matrix<float> identity(4, 4); log << "identity: " << identity << endl; float ar[16] = { 1.,0.,0.,0.,0.,1.,0.,0., 0.,0.,1.,0.,0.,0.,0.,1. }; for (int i = 0, k = 0;i < 4;++i) { for (int j = 0;j < 4;++j) identity(i, j) = ar[k++]; } log << "identity after set: " << identity << endl; Matrix<float> m(identity); log << "m: memberwise initialized: " << m << endl; Matrix<float> m2(8, 12); log << "m2: 8*12: " << m2 << endl; m2 = m; log << "m2 after memberwise assigned to m: " << m2 << endl; float ar2[16] = { 1.3,0.4,2.6,8.2,6.2,1.7,1.3,8.3, 4.2,7.4,2.7,1.9,6.3,8.1,5.6,6.6 }; Matrix<float> m3(4, 4); for (int ix = 0, kx = 0;ix < 4;++ix) for (int j = 0;j < 4;++j) m3(ix, j) = ar2[kx++]; log << "m3: assigned random values: " << m3 << endl; Matrix<float> m4 = m3 * identity; log << m4 << endl; Matrix<float> m5 = m3 + m4; log << m5 << endl; m3 += m4; log << m3 << endl; return 0; }
感谢https://www.cnblogs.com/lv-anchoret/p/8342842.html、https://blog.csdn.net/mind_v/article/details/70228402 给出的友元重载解决方法。
end。
“巅峰诞生虚伪的拥趸,黄昏见证虔诚的信徒。”
原文链接:https://www.cnblogs.com/zhuifeng17/p/12313318.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:computer
下一篇:c++中的 static 关键字
- OpenCV开发笔记(五十九):红胖子8分钟带你深入了解分水岭 2020-05-24
- 算法笔记刷题6 ( PAT 1003我要通过 ) 2020-05-08
- C++基础 学习笔记六:复合类型之数组 2020-04-25
- C++基础 学习笔记五:重载之运算符重载 2020-04-23
- C++基础 学习笔记四:重载之函数重载 2020-04-22
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash