スポンサードリンク
HOME > C++言語 > テンプレートクラス

C++言語 - テンプレートクラス

始めに、テンプレートがどういった機能なのかは、テンプレートとは?で説明しています。

また、テンプレート関数については、テンプレート関数で説明しています。



テンプレート機能は関数にも使えましたが、クラスにも適用できます。

テンプレート機能を付加したクラスをテンプレートクラスと言います。

#include <iostream>

using namespace std;

template <typename T> class myclass {
public:
T data;

void show() {
   cout << data << '\n';
}

};

void main() {

   myclass<int> obj;

   obj.show();

}


このプログラムは、メンバ変数を1つ持ち、

そのメンバ変数の値を出力する単純なクラスを使ったモノです。

メンバ変数のデータ型がいろいろなデータ型に対応できるようになっています。

また、テンプレートクラスのインスタンスを作成する場合には、

クラス名の後に<>でデータ型情報を指定しなければなりません。

new演算子を使った場合や、配列を扱う場合の例も示してみます。


// new演算子
   myclass<int>* p = new myclass<int>;

   p->show();

   delete p;

// new演算子と配列
   myclass<int>* p = new myclass<int>[3];

   p[0].show(); または p->show();
   p[1].show(); または (p+1)->show();
   p[2].show(); または (p+2)->show();

   delete [] p;




いろいろな使い方

また、typenameを使う型情報を複数定義したり、固定のデータ型を使う事も可能です。

赤文字の部分がチェックポイントです。

#include <iostream>

using namespace std;

template
<typename T1, typename T2, int idata> class myclass {
public:
T1 data1;
T2 data2;

void show() {
   cout << data1 << '\n';
   cout << data2 << '\n';
   cout <<
idata << '\n';
}

};

void main() {

   myclass
<int, double, 10> obj;

   obj.show();

}


関数には、省略可能引数と言う機能がありましたが、

テンプレートクラスにも似たような機能があります。

#include <iostream>

using namespace std;

template <typename T
=int, int idata=10> class myclass {
public:
T data;

void show() {
   cout << data << '\n';
   cout << idata << '\n';
}

};

void main() {

   myclass
<> obj;      // <int, 10>で処理される
   myclass<double> obj;   // <double, 10>で処理される
   myclass
<double, 5> obj; // <double, 5>で処理される
   myclass<, 5> obj;    // エラー

   obj.show();

}


また、関数の時と同じように、省略できる引数は後ろに置かなければなりません。

下記のように記述すると、テンプレートクラスのインスタンスを作れなくなります。

template <typename T1=int, int idata> class myclass {




テンプレートクラスのメンバ関数の定義について

(テンプレート)クラスの内容が大きくなるとヘッダファイルとソースファイルに分割

する事が多くなりますが、その場合、メンバ関数の定義の際に注意点があります。

ファイル名:myclass.h
template <typename T> class myclass {
public:
T data;

void show();

};


ファイル名:myclass.cpp
#include <iostream>
#include "myclass.h"

using namespace std;

template <typename T> void myclass<T>::show() {
   cout << data << '\n';
}


このプログラムは、クラス定義を分割した例です。

メンバ関数showが記述されているファイルがクラス定義と別ファイルなので、

赤文字の部分の追記が必要になります。



テンプレートクラスの多重定義

テンプレートクラスは、どのデータ型にも対応するクラスですが、

特定のデータ型の時だけ、違う処理をさせたい場合があります。

こんな場合には、テンプレートクラスを多重定義します。

#include <iostream>

using namespace std;

template <typename T> class myclass {
public:
T data;

void show() {
   cout << data << '\n';
}

};

template<> class myclass<double> {
public:
double data;

void show() {
   cout << "double型=" << data << '\n';
}

};

void main() {

   myclass<int> obj;

   obj.show();

   myclass
<double> Dobj;

   Dobj.show();

}


このプログラムでは、myclassテンプレートクラスが多重定義されています。

与えられたデータ型がdouble型の時だけは、double対応のmyclassが使われます。



スポンサードリンク







HOME

言語解説編
プログラミング用語・知識

C言語

C++言語

Java

C#

Visual Basic.NET

アプリケーション編
C言語による
コンソールプログラミング




Copyright (C) プログラミングランド All Rights Reserved