【C++】template型や自作の名前空間を書いたヘッダーファイルの作成
自分のよく使う関数をヘッダーとしてまとめることを考えた時,
クラスとしてまとめると記述の際に不便になることが多かったので,
自作の名前空間を作り出すことにしました。
■名前空間の作りかた
作り方の基本は簡単で,
___________________________________
/** myfunction.h **/
#include <iostream>
#include <vector>
namespace mf{
/*ここに自作の関数を書く*/
int sum(std::vector<int> nums){
int sum = 0;
for(int i=0;i<nums.size();i++)
sum += nums[i];
return sum;
}
}
___________________________________
これで#include"myfunction.h"で名前空間mfの関数が使えます。
が
このままでは,同じプロジェクトの別のクラスで同様に
#include"myfunction.h"をすると「重複して定義されたエラー」になります。
これが自分が最初に陥ったポイントでした。
でもこれは当たり前。なぜなら
「ヘッダーはもともと宣言のみを書くファイル」
だからです。
そこで,”myfunction.h”を書き直し,新たに"myfunction.cpp"を作成します。
___________________________________
/** myfunction.h **/
#include <iostream>
#include <vector>
namespace mf{
/*ここに自作の関数の宣言を書く*/
int sum(std::vector<int> nums);
}
___________________________________
/** myfunction.cpp **/
#include"myfunction.h"
/*ここに自作の関数の定義を書く*/
int mf::sum(std::vector<int> nums){
int sum = 0;
for(int i=0;i<nums.size();i++)
sum += nums[i];
return sum;
}
___________________________________
これで重複定義はなくなります。
■テンプレート関数
自作の関数を生成してると型に依存しないテンプレート関数を使いたくなります。
こんなのです。
template<typename _T> int change2int(_T val){
int i = val;
return i;
}
テンプレート関数には実装上の注意があります。
それは「定義まで全てヘッダーファイルに書かなければならない」ということです。
これでは,名前空間内の制約とバッティングしてしまいます。
では,どうすればいいのでしょう。
結論を先に言ってしまうと,
テンプレート関数の制約が優先されるので
ヘッダーに定義まで書く
のが正解です。 (VS2008でのみ確認)
なので,上のテンプレート関数を先に名前空間mfに含めるなら,
"myfunction.h"および"myfunction.cpp"はこうなります。
___________________________________
/** myfunction.h **/
#include <iostream>
#include <vector>
namespace mf{
/*ここに自作の関数の宣言を書く*/
int sum(std::vector<int> nums);
/*template関数は定義まで書く*/
template<typename _T> int change2int(_T val){
int i = val;
return i;
}
}
___________________________________
/** myfunction.cpp **/
#include"myfunction.h"
/*ここに自作の関数の定義を書く*/
int mf::sum(std::vector<int> nums){
int sum = 0;
for(int i=0;i<nums.size();i++)
sum += nums[i];
return sum;
}
___________________________________
これで,#include"myfunction.h"で
mf::sum()とmf::change2int()が使えます!
理由はコンパイラ言語とかの勉強したら分かるらしいです。
それでは
クラスとしてまとめると記述の際に不便になることが多かったので,
自作の名前空間を作り出すことにしました。
■名前空間の作りかた
作り方の基本は簡単で,
___________________________________
/** myfunction.h **/
#include <iostream>
#include <vector>
namespace mf{
/*ここに自作の関数を書く*/
int sum(std::vector<int> nums){
int sum = 0;
for(int i=0;i<nums.size();i++)
sum += nums[i];
return sum;
}
}
___________________________________
これで#include"myfunction.h"で名前空間mfの関数が使えます。
が
このままでは,同じプロジェクトの別のクラスで同様に
#include"myfunction.h"をすると「重複して定義されたエラー」になります。
これが自分が最初に陥ったポイントでした。
でもこれは当たり前。なぜなら
「ヘッダーはもともと宣言のみを書くファイル」
だからです。
そこで,”myfunction.h”を書き直し,新たに"myfunction.cpp"を作成します。
___________________________________
/** myfunction.h **/
#include <iostream>
#include <vector>
namespace mf{
/*ここに自作の関数の宣言を書く*/
int sum(std::vector<int> nums);
}
___________________________________
/** myfunction.cpp **/
#include"myfunction.h"
/*ここに自作の関数の定義を書く*/
int mf::sum(std::vector<int> nums){
int sum = 0;
for(int i=0;i<nums.size();i++)
sum += nums[i];
return sum;
}
___________________________________
これで重複定義はなくなります。
■テンプレート関数
自作の関数を生成してると型に依存しないテンプレート関数を使いたくなります。
こんなのです。
template<typename _T> int change2int(_T val){
int i = val;
return i;
}
テンプレート関数には実装上の注意があります。
それは「定義まで全てヘッダーファイルに書かなければならない」ということです。
これでは,名前空間内の制約とバッティングしてしまいます。
では,どうすればいいのでしょう。
結論を先に言ってしまうと,
テンプレート関数の制約が優先されるので
ヘッダーに定義まで書く
のが正解です。 (VS2008でのみ確認)
なので,上のテンプレート関数を先に名前空間mfに含めるなら,
"myfunction.h"および"myfunction.cpp"はこうなります。
___________________________________
/** myfunction.h **/
#include <iostream>
#include <vector>
namespace mf{
/*ここに自作の関数の宣言を書く*/
int sum(std::vector<int> nums);
/*template関数は定義まで書く*/
template<typename _T> int change2int(_T val){
int i = val;
return i;
}
}
___________________________________
/** myfunction.cpp **/
#include"myfunction.h"
/*ここに自作の関数の定義を書く*/
int mf::sum(std::vector<int> nums){
int sum = 0;
for(int i=0;i<nums.size();i++)
sum += nums[i];
return sum;
}
___________________________________
これで,#include"myfunction.h"で
mf::sum()とmf::change2int()が使えます!
理由はコンパイラ言語とかの勉強したら分かるらしいです。
それでは
努力値を下げるきのみの効果
努力値を下げるきのみの効果と突然変異について,情報を載せます。
※「101以上なら100まで下がる」効果があるのは 第4世代 までです
現在,間違った情報を掲載しているページも多く,
誤解している人や混乱している人が多く発生している状況なので,
一応まとめました。
ついでに努力値を下げるきのみの突然変異の組み合わせ一覧も掲載します。
他のきのみの突然変異の一覧
きのみ | 効果 |
---|---|
ザロクのみ | 使用するとHPの努力値が10下がり,使ったポケモンが少しなつく |
ネコブのみ | 使用すると攻撃の努力値が10下がり,使ったポケモンが少しなつく |
タポルのみ | 使用すると防御の努力値が10下がり,使ったポケモンが少しなつく |
ロメのみ | 使用すると特攻の努力値が10下がり,使ったポケモンが少しなつく |
ウブのみ | 使用すると特防の努力値が10下がり,使ったポケモンが少しなつく |
マトマのみ | 使用すると素早さの努力値が10下がり,使ったポケモンが少しなつく |
※「101以上なら100まで下がる」効果があるのは 第4世代 までです
現在,間違った情報を掲載しているページも多く,
誤解している人や混乱している人が多く発生している状況なので,
一応まとめました。
ついでに努力値を下げるきのみの突然変異の組み合わせ一覧も掲載します。
できるきのみ | 組み合わせ |
---|---|
ザロク | マゴ + イア |
ネコブ | カゴ + キー |
タポル | オレン + モモン |
ロメ | ナナシ + ヒメリ |
ウブ | フィラ + バンジ |
マトマ | ラム + オボン |
できるきのみ | 組み合わせ |
---|---|
ヤタピ | ザロク + カシブ |
ズア | ネコブ + ソクノ |
リュガ | タポル + タンガ |
チイラ | ロメ + ヤチェ |
カムラ | ウブ + ロゼル |
アッキ | リュガ + チイラ |
タラプ | ヤタピ + カムラ |
【ポケモンXY】神秘ガルーラ
ガルーラ、現環境に多いですね。
というわけで、ノーマルメインで考察してるブログとして、
現環境で動きやすいと実感できたガルーラを紹介していきます。
しんぴのまもりガルーラ
種族値:105-125-100-60-100-100
性格:陽気 特性:おやこあい
努力値:4-252-0-0-0-252
実値:181-177-120-*-121-167
技:グロウパンチ/かみくだく/じしん/しんぴのまもり
ポイントは神秘の守り。
最初は捨て身不意打ちガルーラで回してましたが、
パンプジンを後出し鬼火で何も出来ない。しかも後続に負担がかかる。
という展開ばかりでパンプジンへのディスアドが大きすぎました。
そこで、パンプジン後出しに有利を取れるよう、パンプジンの鬼火にあわせて打てる神秘の守りを搭載しました。
これで、噛み砕くで有利が取れ、例えゴツメでも後続に火傷の負担がかからないので、実に動きやすくなります。
ついでに、噛み砕くは攻撃をスカされないだけでなく2回攻撃によってBダウンまで期待できます。
神秘はロトムの電磁波やフシギバナの眠り粉あたりも無効にして、安心してグロウで起点にできることも多かったですね。
ただ注意するのは、不意打ち無いことでガブへの有効打がなくなること。
まぁ鮫肌ゴツメも普通にいる中では地震安定ですけどね。
耐久のラインをガルーラ恩返し耐えまで振ろうか少し考えてるので、AS以外の型も紹介するかもです