C++メモ
C++では定数に対して"#define"を使わない。
#define PI 3.14159265
ではなく
static const double Pi = 3.14159265;
とすることで、定数の型をはっきりさせ、デバッグもやりやすくなる。
定数の定義を集めたclassを作る場合は、
/* --- Common.h --- */ #ifndef _COMMON_H_ #define _COMMON_H_ class Common { public: static const double Pi = 3.14159265; }; #endif
と定義しておけば、
/* --- Hoge.cpp --- */ #include <iostream> #include "Common.h" int main(int argc, char *argv[]) { std::cout << Common::Pi << std::cout; return 0; }
というように呼び出して使える。
だが、文字列定数となるとclassの宣言の中では定義できない。
/* --- Common.h(エラーになる) --- */ #ifndef _COMMON_H_ #define _COMMON_H_ #include <string> class Common { public: static const std::string Hoge = "hoge"; }; #endif
というワケにはいかない。コンパイルしようとすると
Common.h:8: error: invalid in-class initialization of static data member of non-integral type `const std::string'
と怒られる。(意味はよくわからない。)
ので、文字列定数を定義する場合は
/* --- Common.h --- */ #ifndef _COMMON_H_ #define _COMMON_H_ #include <string> class Common { public: static const std::string Hoge; }; #endif /* --- Common.cpp --- */ #include "Common.h" const std::string Common::Hoge("hoge");
というように、宣言だけをclassの中に書いておいて、
その初期化は外で行う。ヘッダに書いてしまうと多重includeで2重定義になってしまうようだ。
うーん、むずかしい。