普通のクラスと同様にクラステンプレートにメンバ関数を設定することができます

ソーラー「先程は


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型の変数にすることもできるってわけだ」


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

作者を応援しよう!

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

応援したユーザー

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

新規登録で充実の読書を

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

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

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