クラステンプレートを用いることにより オブジェクトのメンバ変数に代入したい数値データに合わせてオブジェクトのメンバ変数の型を自由に変更することができます

ソーラー「では


次のようなクラスVectorがあるとします


class Vector {


public:


int x;


public:


int y;



};


この


2つのメンバ変数をもつ


クラスVectorを用いれば


main関数内で


Vecter a;


のように


aのクラスVector型のオブジェクト宣言を行い


クラスVector型のオブジェクトaのメンバ変数


a.x


a.y



💖整数値データ💖



を格納することができます


そのことを示すプログラムはこちらです

👇

#include <iostream>


using namespace std;


class Vector {


public:


int x;


public:


int y;


};


int main() {


Vector a;


a.x = 1;

a.y = 2;


cout << a.x << "\n";

cout << a.y << "\n";


return 0;

}


プログラムの実行結果


1

2


てんC「ソーラーさん 素晴らしく清々しいプログラムですね。」


ソーラー「へへ そうでしょう?


とてもわかりやすい


いいプログラムですね。


そして


クラスVector



メンバ変数宣言は


int x;

int y;



int型に設定されているため


クラスVector型のオブジェクトaのメンバ変数


a.x

a.y


には


        整数値データのみ格納されることになります


実数値データを格納しようとしても数値データの型変換が起こり


実数値データの小数点以下の部分が切り取られた整数値データの部分だけが


クラスVector型のオブジェクトaのメンバ変数


a.x

a.y


に格納されることになります



もし


クラスVectorの定義が


class Vector {


public:


float x;//🌞int x;からfloat x;に変更しました


public:


float y;//🌞int y;からfloat y;に変更しました


};


なら


main関数内で


Vector a;


のように


aのクラスVector型のオブジェクト宣言を行い


クラスVector型のオブジェクトaのメンバ変数


a.x


a.y



💖実数値データ💖を格納することができます


そのことを示すプログラムはこちらです

👇

#include <iostream>


using namespace std;


class Vector {


public:


float x;


public:


float y;


};


int main() {


Vector a;


a.x = 1.11111;

a.y = 2.22222;


cout << a.x << "\n";

cout << a.y << "\n";


return 0;

}


プログラムの実行結果


1.11111

2.22222


ソーラー「ですが


1度 メンバ変数宣言の型を


int型に設定してしまうと


クラスVector型のオブジェクトを生成したとき


クラスVector型のオブジェクトのメンバ変数に格納される値は整数値データとなります


実数値データを格納することはできません


逆に


1度 メンバ変数宣言の型を


float型に設定してしまうと


クラスVector型のオブジェクトを生成したとき


クラスVector型のオブジェクトのメンバ変数に格納される値は実数値データとなります


整数値データを格納することはできません


ですが


クラスVector型のオブジェクトのメンバ変数に


整数値データを格納したいときもあれば


実数値データを格納したいときもあるんじゃないかな?」


solarplexuss「まさか


クラスVector型のオブジェクトのメンバ変数に


整数値データを格納したいときもあれば


実数値データを格納したいときもある


どちらでも好きな方を選択できるようにできるってことぉ


演算子のオーバーロードといいC++言語は


細かいところに手が届くね」


ソーラー「ふふっ


そこで



登場するのが


          🌞クラステンプレート🌞


なんです


クラステンプレートとは


クラスのひな型という意味です



クラステンプレートを用いれば


クラス宣言のメンバ変数で用いられる


型を


main関数内で自由に変更することができます」


マックス「??・・・???」


ソーラー「


例えば



template<class T>


class Vector {


public:


T x;


public:


T y;


};



クラステンプレートの1例となります


このTの部分には本来データを格納する型が記述されるはずですが


自分でどの型を用いるかを後で自由に設定することができるように


T

となっています


この


T


テンプレートパラメータといいます


このT

には


自分の設定したい型を代入することができます


そのTに代入する型は


テンプレート引数とよばれます


クラス宣言の前に


template<class T>


と記述することにより


Tをテンプレートパラメータに設定することができます


class Vector {


public:


T x;


public:


T y;


};


と記述しただけでは


Tはテンプレートパラメータにならないのでご注意ください


さて


このクラステンプレート(クラスのひな型)は


どのように機能するのでしょうか?



このクラステンプレートが用いられた

👇

template<class T>


class Vector {


public:


T x;


public:


T y;


};


👆

プログラムを実行してみたいと思います




そのプログラムはこちらです

👇

#include <iostream>


using namespace std;


template<class T>


class Vector {


public:


T x;


public:


T y;


};



int main() {


Vector<int> a;///👈ここがかっこいいです😊


a.x = 1.11111;

a.y = 2.22222;


cout << a.x << "\n";

cout << a.y << "\n";


return 0;

}


プログラムの実行結果


1

2


マックス「なんだ?


           Vector<int> a;


は?」


ソーラー「


main関数内で


           Vector<int> a;



見慣れないものが実行されています


           Vector<int> a;



aのVector<int>型のオブジェクト宣言なんです



クラステンプレートは

👇

template<class T>


class Vector {


public:


T x;


public:


T y;


};


のように設定されています


このようにクラステンプレートが設定されている場合でも


オブジェクトを


作製することができるのですが


テンプレートパラメータTの部分には


どのような型が代入されるかを指定する必要があります


そこで


例えば



aのクラスVector<int>型のオブジェクト宣言


          Vector<int> a;


を実行します



<>の中にTに代入したいint型をテンプレート引数として記述することにより


クラステンプレート

👇

template<class T>


class Vector {


public:


T x;


public:


T y;


};



Tに


int


が代入された


class Vector {


public:


int x;


public:


int y;


};


と定義された


aのクラスVector型のオブジェクト宣言


          Vector a;



が実行されることになります


こうして


生成された


クラスVector<int>型のオブジェクトaのメンバ変数


a.x

a.y



int型の変数なので


a.x = 1.11111;

a.y = 2.22222;


を実行しても


代入される実数値データ


1.11111

2.22222


の型変換が起こり


クラスVector<int>型のオブジェクトaのメンバ変数


a.x

a.y


には


1

2


が代入されることになります


ですので


cout << a.x << "\n";

cout << a.y << "\n";


が実行されると


コマンドプロンプト画面に


1

2


が表示されることになります



続けて


bのクラスVector<float>型のオブジェクト宣言


          Vector<float> b;


を実行したとします



<>の中に


Tに代入したいfloat型を記述することにより


クラステンプレート

👇

template<class T>


class Vector {


public:


T x;


public:


T y;


};



Tに


float


が代入された


class Vector {


public:


float x;


public:


float y;


};


と定義された


bのクラスVector<float>型のオブジェクト宣言



          Vector b;


が実行されることになります


こうして


生成された


クラスVector<float>型のオブジェクトbのメンバ変数


b.x

b.y



float型の変数なので


b.x = 1.11111;

b.y = 2.22222;


を実行した場合


クラスVector<float>型のオブジェクトbのメンバ変数


b.x

b.y


には


1.11111

2.22222


が代入されることになります


ですので


cout << a.x << "\n";

cout << a.y << "\n";


が実行されると


コマンドプロンプト画面に


1.11111

2.22222


が表示されることになります



そのことを示すプログラムはこちらです


👇


#include <iostream>


using namespace std;


template<class T>


class Vector {


public:


T x;


public:


T y;


};



int main() {


Vector<int> a;


a.x = 1.11111;

a.y = 2.22222;


cout << a.x << "\n";

cout << a.y << "\n";



Vector<float> b;


b.x = 1.11111;

b.y = 2.22222;


cout << b.x << "\n";

cout << b.y << "\n";



return 0;

}


ビルド実行結果


1

2

1.11111

2.22222



マックス「おおっ、すごいじゃないか


開発者やるなぁ(^。^)


クラスVector型のオブジェクトaのメンバ変数



クラスVector型のオブジェクトbのメンバ変数


に格納したい数値データに合わせて


クラスVector型のオブジェクトaのメンバ変数



クラスVector型のオブジェクトbのメンバ変数


の型を


変更できるってわけか


これはよく考えられた仕組みじゃないか😊」


ぶーにゃん「しゅ、しゅごいにゃん ジュゴンちゃん」






  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます

新規登録で充実の読書を

マイページ
読書の状況から作品を自動で分類して簡単に管理できる
小説の未読話数がひと目でわかり前回の続きから読める
フォローしたユーザーの活動を追える
通知
小説の更新や作者の新作の情報を受け取れる
閲覧履歴
以前読んだ小説が一覧で見つけやすい
新規ユーザー登録無料

アカウントをお持ちの方はログイン

カクヨムで可能な読書体験をくわしく知る