こんにちは!
みなさん、体調崩されてませんか?
私は絶賛風邪と戦ってますです……。
バイト先でも流行っているようですし、そもそも季節の変わり目なので体調管理はしっかりとして、風邪をひかれないようにご自愛ください。
声が上手く出ないのは、つまりコミュニケーション能力も落ちてしまうという事……早く喉を治さなくては!
さて、そんな中ようやく汎用クラスですよ!
昨日タイミングよく復習も出来たのでさっそく。
ちなみに汎用関数に関してはこちらへ
そんな問題の汎用クラスさんがこちら!
template<class T>
class MyClass
{
//データ
T data;
public:
//コンストラクタ
MyClass(T data)
{
this->data = data;
}//データを取得する関数
T GetData()
{
return data;
}
};
一見、普通のクラスに一番上のtemplate<class T>がついただけですが……
……いや、実際それだけなんですよね!
一番上にtemplate<class T>と、変数の型がTになっていることくらいしか変化はないです。
ちなみにクラスの内容としては、コンストラクタで、dataを代入して、GetData()で取得するだけになっています。
このtemplateのTさんは、やはりなんにでもなってくれまして……
main文ではごくごく普通のクラスとして使えます!
実際にmainの中はといいますと……
int main()
{
MyClass<int> a(10);
std::cout << a.GetData() << std::endl;return 0;
}
MyClass<int> a(10);の一文で変数を作っています。
ここでポイントなのが、定義の書き方で……
クラス名<Tに指定したい型名> 変数名(Tの値);
間違っても、MyClass a <int>(10);とか、MyClass a (<int>10);とかはダメ
ですからね!(実際に私がやらかしていました……)
でもこれさえ押さえておけば、あとは普通にクラスとして使用できるので!
「……え、これだけ?」
一体私は何に詰まっていたんだ……?
そう思って、その以前のプログラム見ていると……
template<class T>
class A
{(以下省略)
…………
そりゃあ、ごちゃごちゃになりますよね!?
この定義のままでmain文を書いてもらえればお分かりの通り、クラス名のAと、templateのT……どっちがどっちだか分からなくなりますよねぇ……
プログラム写していただけなのにどうしてって……そういうことですよ!
変数名もクラス名もめんどくさがらずしっかりとつけないと……ですね。