C++ 方法模板

         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;
}


猜你喜欢

转载自blog.csdn.net/u011206291/article/details/52934173