C ++:クラステンプレートの定義とインスタンス化


クラステンプレート定義形式

template<class T1, class T2, ..., class Tn> 
class 类模板名
{
// 类内成员定义 
};

クラステンプレートを使用して動的シーケンステーブルを作成する

template <class T>
class SeqList {
	T* m_data;
	size_t m_size;
	size_t m_capacity;

	void checkCapacity();
public:
	SeqList(size_t size = 0, size_t capacity = 10) :
		m_data(new T[capacity]),
		m_size(size),
		m_capacity(capacity)
	{
	}

	T& operator [](size_t i)
	{
		return m_data[i];
	}

	void push_back(const T& src);
	void pop_back();

	int size();

	~SeqList();
};

// 在类中声明,在类外定义。 
// 注意:类模板中函数放在类外进行定义时,需要加模板参数列表
template <class T>
void SeqList<T>::checkCapacity() {
	if (m_size == m_capacity) {
		m_capacity *= 2;

		m_data = (T*)realloc(m_data, sizeof(T) * m_capacity);
		/*T* newSpace = new T[m_capacity];

		for (i = 0; i < m_size; i++) {
			newSpace[i] = m_data[i];
		}
		delete[] m_data;
		m_data = newSpace;*/
	}
}

template <class T>
void SeqList<T>::push_back(const T& src) {
	checkCapacity();

	m_data[m_size++] = src;
}

template <class T>
void SeqList<T>::pop_back() {
	if (m_size == 0) {
		return;
	}
	m_size--;
}

template <class T>
int SeqList<T>::size() {
	return m_size;
}

template <class T>
SeqList<T>::~SeqList() {
	if (m_data) {
		delete[] m_data;
	}
	m_size = m_capacity = 0;
}

注:SeqListは特定のクラスではなく、インスタンス化される型に基づいてコンパイラーが特定のクラスを生成するための型です

クラステンプレートの実装では、次の点に注意してください。

  1. クラステンプレート実装のプロセスでは、クラスと関数の実装を2つのファイルに分割しないことが最善です。関数の実装とクラスを.hファイルに直接入力します。

  2. 2つのファイルに分割する場合、両方のファイルをメイン関数ファイルに含める必要があります。そうしないと、対応する実装コードが見つからず、実行可能関数の物理バージョンを生成できません。

クラステンプレートのインスタンス化

クラステンプレートのインスタンス化は、関数テンプレートのインスタンス化とは異なります。クラステンプレートのインスタンス化の後に、クラステンプレートの名前の後に<>を続ける必要があります。その後、インスタンス化のタイプを<>に配置できます。クラステンプレートの名前は実際のクラスではなく、インスタンス化されます結果は実際のクラスです。

コード例:

int main(){ 
	// SeqList类名,SeqList<int>才是类型 
	SeqList<int> sl;

	sl.push_back(1);
	sl.push_back(2);
	sl.push_back(3);
	sl.pop_back();
	SeqList<double> s1;
	s1.push_back(3.1415);
	s1.push_back(1.618);
	for (int i = 0; i < sl.size(); ++i)
	{
		cout << sl[i] << " ";
	}
	cout << endl;
	for (int i = 0; i < s1.size(); ++i)
	{
		cout << s1[i] << " ";
	}
	cout << endl;

	return 0;
}

コード生成図
ここに画像の説明を挿入


意見が異なる場合は、メッセージを残して議論してください

元の記事を152件公開 賞賛されている45件 10,000回以上の閲覧

おすすめ

転載: blog.csdn.net/AngelDg/article/details/104914248