普通のクラスと同様にクラステンプレートにメンバ関数を設定することができます
ソーラー「先程は
template<class T>
class Vector {
public:
T x;
public:
T y;
};
という
Vectorクラスのクラステンプレートを用いてプログラムを実行しました
このTの部分には本来データを格納する型が記述されるはずですが
自分でどの型を用いるかを後でmain関数内で自由に設定することができるように
T
となっています
この
T
を
テンプレートパラメータといいます
このT
には
int doubleなど
自分の設定したい型を代入することができます
自分の設定したい型をテンプレート引数といいます
template<class T>
を
Vectorクラスのクラステンプレートのクラス宣言の冒頭に記述することにより
Tをテンプレートパラメータに設定することができます
class Vector {
public:
T x;
public:
T y;
};
と記述しただけでは
Tはテンプレートパラメータにならないのでご注意ください
Tにどのような型が代入されるかは
main関数内で
オブジェクト宣言を実行するとき指定することになります
ところで
このVectorクラスのクラステンプレート(クラスのひな型)には
メンバ変数宣言だけが設定されていて
メンバ関数宣言
が設定されていませんが
もちろん
メンバ関数宣言を設定することもできます
たとえば次のようにメンバ関数宣言を設定することもできます
👇
template<class T>
class Vector {
public:
T x;
public:
T y;
public:
void vectordatadisplay();
};
👆
Vectorクラスのクラステンプレートのクラス宣言内で
メンバ関数宣言
void vectordatadisplay();
が設定されています
もちろん
この
Vectorクラスのクラステンプレートのメンバ関数vectordatadisplay()の定義が必要になってきます
そうですね
Vectorクラスのクラステンプレートのメンバ関数vectordatadisplay()の定義をどのようにおこなってみよっかな?
ふつう
class Vector {
public:
T x;
public:
T y;
};
のようなクラスVectorがあった場合
Vectorクラスのメンバ関数vectordatadisplay()の定義は
void Vector::vectordatadisplay(){
cout<<x<<"\n";
cout<<y<<"\n";
}
のように記述します
ですが
💖Vectorクラスのクラステンプレート💖
のメンバ関数vectordatadisplay()の定義では
まず最初に
template<class T>
を記述します
ですので
Vectorクラスのクラステンプレートのメンバ関数vectordatadisplay()の定義は
template<class T>//👈ここです
void Vector<T>::vectordatadisplay(){
cout<<x<<"\n";
cout<<y<<"\n";
}
となります
この
template<class T>はどこから出てきたのかというと
Vectorクラスのクラステンプレートのクラス宣言の先頭についている
template<class T>なんです
以下のように
template<class T>を
Vectorクラスのクラステンプレートのメンバ関数vectordatadisplay()の定義の前にも記述することになります
👇
template<class T>
void Vector<T>::vectordatadisplay(){
cout<<x<<"\n";
cout<<y<<"\n";
}
ところで👆このクラスVectorのクラステンプレートのメンバ関数vectordatadisplay()の定義で
注目していただきたいのが
void Vector<T>::vectordatadisplay()
の部分です
💖Vectorクラスのクラステンプレート💖のメンバ関数
vectordatadisplay()の定義
では
void Vector::vectordatadisplay()
ではなく
void Vector<T>::vectordatadisplay()
と記述することになります
void Vector::vectordatadisplay()と記述しては
ビルドエラーが表示されることになります
なぜなら
今は
Vectorクラスのクラステンプレートが設定されていて
Vectorのクラス宣言はおこなわれていません
ですので
クラスVectorは存在していないのに
クラスVectorのメンバ関数
vectordatadisplay()
の定義を記述することはできません
ですので
クラステンプレートVector<T>のメンバ関数
vectordatadisplay()
の定義は
void Vector<T>::vectordatadisplay(){
cout<<x<<"\n";
cout<<y<<"\n";
}
と記述します
void Vector::vectordatadisplay(){
cout<<x<<"\n";
cout<<y<<"\n";
}
と記述しては
クラスVectorのメンバ関数vectordatadisplay()の定義を行うことになり
ビルドエラーが表示されることになります
それでは
Vectorクラスのクラステンプレート
と
そのメンバ関数vectordatadisplay()の定義
👇
template<class T>
class Vector {
public:
T x;
public:
T y;
public:
void vectordatadisplay();
};
template<class T>
void Vector<T>::vectordatadisplay(){
cout<<x<<"\n";
cout<<y<<"\n";
}
👆
が用いられたプログラムを実行してみたいと思います
その時のプログラムは・・・」
てんC「こちらではないですか💖👇」
#include <iostream>
using namespace std;
template<class T>//👈ここですね
class Vector {
public:
T x;
public:
T y;
public:
void vectordatadisplay();
};
template<class T>//👈ここですね
void Vector<T>::vectordatadisplay() {
cout << x << "\n";
cout << y << "\n";
}
int main() {
Vector<int> a;
a.x = 1;
a.y = 2;
a.vectordatadisplay();
return 0;
}
プログラムの実行結果
1
2
てんC「ソーラーさん
このプログラムでは
まず
main関数内で
aのVector<int>型のオブジェクト宣言
Vector<int> a;
が実行されています
<>の中にintを記述して
Vector<int> a;
が実行されると
Vectorクラスのクラステンプレート
template<class T>
class Vector {
public:
T x;
public:
T y;
public:
void vectordatadisplay();
};
の
Tにintが代入された状態の
👇
class Vector {
public:
int x;
public:
int y;
public:
void vectordatadisplay();
};
👆
となった状態の
aのクラスVector<int>型のオブジェクト宣言
Vector<int> a;
が実行されることになります
次に
a.x=1;
a.y=2;
により
クラスVector<int>型のオブジェクトaのメンバ変数a.x
に
1
が
クラスVector<int>型のオブジェクトaのメンバ変数a.y
に
2
が
代入されることになります
次に
a.vectordatadisplay();
が実行されると
Vectorクラスのクラステンプレートのメンバ関数vectordatadisplay()
の定義
👇
template<class T>
void Vector<T>::vectordatadisplay(){
cout<<x<<"\n";
cout<<y<<"\n";
}
の
Tにintが
xにa.x
yにa.y
が代入された
cout<<a.x<<"\n";
cout<<a.y<<"\n";
が実行されることになるので
プログラムの実行結果に
1
2
が表示されます
今の
Vectorクラスのクラステンプレートのメンバ関数vectordatadisplay()
の定義
👇
template<class T>
void Vector<T>::vectordatadisplay(){
cout<<x<<"\n";
cout<<y<<"\n";
}
の{}内ではTが用いられていませんが
もし
Vectorクラスのクラステンプレートのメンバ関数vectordatadisplay()
の定義が
👇
template<class T>
void Vector<T>::vectordatadisplay(){
cout<<x<<"\n";
cout<<y<<"\n";
T c=3;
cout<<c<<"\n";
}
👆
のように記述してあれば
a.vectordatadisplay();
が実行されると
Vectorクラスのクラステンプレートのメンバ関数vectordatadisplay()
の定義
👇
template<class T>
void Vector<T>::vectordatadisplay(){
cout<<x<<"\n";
cout<<y<<"\n";
T c=3;
cout<<c<<"\n";
}
の
Tにintが
xにa.x
yにa.y
が代入された
cout<<a.x<<"\n";
cout<<a.y<<"\n";
int c=3;
cout<<c<<"\n";
が実行されることになるので
プログラムの実行結果に
1
2
3
が表示されることになります
そのことを示すプログラムはこちらとなります
👇
#include <iostream>
using namespace std;
template<class T>
class Vector {
public:
T x;
public:
T y;
public:
void vectordatadisplay();
};
template<class T>
void Vector<T>::vectordatadisplay() {
cout << x << "\n";
cout << y << "\n";
T c = 3;
cout << c << "\n";
}
int main() {
Vector<int> a;
a.x = 1;
a.y = 2;
a.vectordatadisplay();
return 0;
}
プログラムの実行結果
1
2
3
マックス「なるほど
T c = 3;
か・・・
Vectorクラスのクラステンプレートのメンバ関数vectordatadisplay()
の定義内でも
T c = 3;
のように
テンプレートパラメータTを設定することにより
main関数内で
Vector<T>型のオブジェクト宣言を実行するとき
Tに自由に
自分の好きな変数の型を代入することができるようになるわけだ
その結果
cをint型の変数にすることもできれば
cをfloat型の変数にすることもできるってわけだ」
新規登録で充実の読書を
- マイページ
- 読書の状況から作品を自動で分類して簡単に管理できる
- 小説の未読話数がひと目でわかり前回の続きから読める
- フォローしたユーザーの活動を追える
- 通知
- 小説の更新や作者の新作の情報を受け取れる
- 閲覧履歴
- 以前読んだ小説が一覧で見つけやすい
アカウントをお持ちの方はログイン
ビューワー設定
文字サイズ
背景色
フォント
組み方向
機能をオンにすると、画面の下部をタップする度に自動的にスクロールして読み進められます。
応援すると応援コメントも書けます