こんにちは!

みなさん、体調崩されてませんか?

 

私は絶賛風邪と戦ってますです……。

バイト先でも流行っているようですし、そもそも季節の変わり目なので体調管理はしっかりとして、風邪をひかれないようにご自愛ください。

 

声が上手く出ないのは、つまりコミュニケーション能力も落ちてしまうという事……早く喉を治さなくては!

 

 

さて、そんな中ようやく汎用クラスですよ!

昨日タイミングよく復習も出来たのでさっそく。

ちなみに汎用関数に関してはこちらへ

 

そんな問題の汎用クラスさんがこちら!

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……どっちがどっちだか分からなくなりますよねぇ……
プログラム写していただけなのにどうしてって……そういうことですよ!
 
変数名もクラス名もめんどくさがらずしっかりとつけないと……ですね。