少し定数について書いてみます。
前回、privateメンバ定数を使いました。
当然、publicにも定数は書けますので、作ってみます。
<sample program cpp054-01>
#include <iostream>
class Card {
public:
Card();
const int SUIT;
const int NUMBER;
const int CARD_MAX;
};
int main()
{
Card card;
std::cout << card.SUIT << std::endl;
std::cout << card.NUMBER << std::endl;
std::cout << card.CARD_MAX << std::endl;
return 0;
}
Card::Card() : SUIT(4), NUMBER(13), CARD_MAX(SUIT * NUMBER)
{
}
|
<実行結果>
4 13 52 続行するには何かキーを押してください・・・
publicな定数としてmain関数でも使う事が出来ている事が分かります。
しかし、次のプログラムではどうでしょう?
ちょっと長くなりますがトランプゲームの一部だと思ってください。
<sample program cpp054-02>
#include <iostream>
#include <vector>
class Card {
public:
Card();
const int SUIT;
const int NUMBER;
const int CARD_MAX;
};
class Deck {
public:
void ShowDeck();
private:
std::vector<Card> vecCard;
};
int main()
{
return 0;
}
Card::Card() : SUIT(4), NUMBER(13), CARD_MAX(SUIT * NUMBER)
{
}
void Deck::ShowDeck()
{
for (int i = 0; i < CARD_MAX; i++) {
}
}
|
<コンパイル結果>
error C2065: 'CARD_MAX': 定義されていない識別子です。
Cardクラスの定数を使って、トランプのデッキを表示したかったのですが、エラーになりました。
CardクラスのCARD_MAX定数は、実体が作られコンストラクタ関数が実行されない限り値がセットされません。
と言うよりは、Cardクラスの実体が無い限りCARD_MAXの実体も作られないのです。
では実体を作れば・・・
<sample program cpp054-03>
#include <iostream>
#include <vector>
class Card {
public:
Card();
const int SUIT;
const int NUMBER;
const int CARD_MAX;
};
class Deck {
public:
void ShowDeck();
private:
std::vector<Card> vecCard;
};
int main()
{
return 0;
}
Card::Card() : SUIT(4), NUMBER(13), CARD_MAX(SUIT * NUMBER)
{
}
void Deck::ShowDeck()
{
Card card;
for (int i = 0; i < card.CARD_MAX; i++) {
}
}
|
上手くコンパイルを通りました。
しかし、定数を使うためだけに実体を作ると言うのはスマートな方法とは言えません。
このような場面に対応出来るのがstaticメンバ定数です。