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重定義になってしまうようだ。

うーん、むずかしい。