C++允许模板化类中的单个方法。这些方法可以在类模板中,也可以在非模板化的类中。在编写模板化的类方法时,实际在为很多不同的类型编写很多不同版本的方法。在类模板中,方法模板对赋值运算符和复制构造函数非常有用
注意:不能用方法模板编写虚方法和析构函数
考虑最早只有一个模板参数——元素类型——的Grid模板。
Grid<int > myIntGrid;
Grid<double> myDoubelGrid;
Grid<int>和Grid<double>是两种不同的类型。下面两行代码都无法编译:
myDoubelGrid=myIntGrid;
Grid<double>newDoubleGrid(myIntGrid);
在Grid类中添加模板化的复制构造函数和复制运算符,可以生成将一种网格类型转换为另一种类型的例程。
#pragma once
#include<vector>
template <typename T>
class Grid
{
public:
explicit Grid(size_t inWidth = kDeafaultWidth,size_t inHeight=kDefaultHeight);
virtual ~Grid();
template<typename E>
Grid(const Grid<E>& src);
template<typename E>
Grid<T>& operator=(const Grid<E>&rhs);
void setElementAt(size_t x, size_t y, const T& inElement);
T& getElementAt(size_t x, size_t y);
const T& getElementAt(size_t x, size_t y) const;
static const size_t kDeafaultWidth = 10;
static const size_t kDefaultHeight = 10;
size_t mWidth, mHeight;//应在private下 在此可以Grid<double> -> Grid<int>转换 ?
private:
template<typename E>
void copyFrom(const Grid<E> &src);
void initializeCellContainer();
std::vector<std::vector<T>> mCells;
/*
size_t mWidth, mHeight;//在此Grid<double> -> Grid<int>时copyFrom()函数无法访问
*/
};
template<typename T>
inline Grid<T>::Grid(size_t inWidth, size_t inHeight):mWidth(inWidth),mHeight(inHeight)
{
initializeCellContainer();
}
template<typename T>
inline Grid<T>::~Grid()
{
}
template<typename T>
inline void Grid<T>::setElementAt(size_t x, size_t y, const T & inElement)
{
mCells[x][y] = inElement;
}
template<typename T>
inline T & Grid<T>::getElementAt(size_t x, size_t y)
{
return mCells[x][y];
}
template<typename T>
inline const T & Grid<T>::getElementAt(size_t x, size_t y) const
{
return mCells[x][y];
}
template<typename T>
template<typename E>
inline void Grid<T>::copyFrom(const Grid<E>& src)
{
mWidth = src.mWidth;
mHeight = src.mHeight;
initializeCellContainer();
for (size_t i = 0; i < mWidth; i++)
{
for (size_t j = 0; j < mHeight; j++)
{
mCells[i][j] = src.getElementAt(i, j);
}
}
}
template<typename T>
inline void Grid<T>::initializeCellContainer()
{
mCells.resize(mWidth);
for (std::vector<T>& column : mCells)
{
column.resize(mHeight);
}
}
/*复制构造函数的定义*/
template<typename T>
template<typename E>
inline Grid<T>::Grid(const Grid<E>& src)
{
copyFrom(src);
}
template<typename T>
template<typename E>
inline Grid<T>& Grid<T>::operator=(const Grid<E>& rhs)
{
copyFrom(rhs);
return *this;
}
Grid的实现
#include"stdafx.h"
#include"Grid.h"
#include<iostream>
using namespace std;
int main()
{
Grid<int> myIntGrid(10,10);
Grid<double> myDoubleGrid(10, 10);
Grid<double> anotherDouble;
myDoubleGrid.setElementAt(1, 1, 3.1415);
cout << myDoubleGrid.getElementAt(1, 1) << endl;
myIntGrid = myDoubleGrid;
cout << myIntGrid.getElementAt(1, 1) << endl;
return 0;
}