usao さんへ。
返信ありがとうございます。
別の型だけど、テンプレートを使っていろいろな型を入れられるような処理を作れるかな?
と思い勉強の一環として試していました。
事の発端として、脱出ゲームをC++で作ったらどうなるかな?というところから
フラグをリスト(実際には map?)で管理しようかなという考えに至って、
いろいろな型のフラグをひとつのリストに詰め込めないものかなとごちゃごちゃ試す内に
質問のコードのようなものが出来上がりました。
フラグ管理を実装するにあたって、実際にはただ、いくつか変数を持っておくだけだったり
list<int>でも十分対応できるのですが、テンプレートの勉強も含めて試していた次第です。
現状、アドバイスをいただきまして、unionの型としてなんとなくそれらしい形にはなったのですが、
もっとテンプレートや継承といったC++らしい形でプログラムできたらいいなと思っています。
オブジェクト指向の書き方がなかなか身に付かず、いろいろと苦戦してます(汗
使い方としては Flagクラスをリストから取り出して、ゲッター・セッターで読み書きができればいいと
思っています。その際、intやfloat、std::string、自分でつくったクラス、配列など自由に入れられたら
便利なのかな?と考えたのですが、脱出ゲームのフラグ管理の設計としては必要ないですかね?
イメージは Objective-C の NSArray に NSString (文字列クラス) や NSNumber (数値クラス) など
いろんな型を入れる事ができるので、そんなことを C++ でやってみたかったです。
そこでさらに、NSString、NSNumber等をテンプレートにできるかな?という試みだったのですが、
全然技術力が追いつかなかったです (--;)
union は知らなかったのですが、これなら形に出来るかなと一応コードを書いてみて
ひとまず実装できるまでにはなりました。アドバイスありがとうございます^^
まだ、こうした方が良いよとか、なにかあれば教えていただけるとありがたいです。
あとlist から vector に変えてみました。
コード:
// 実装用フラグデータ --------------------
struct sFlagData {
static const int CDATA_MAX = 8; // 文字列の最大数
// フラグデータ
union uFlagData {
int iData;
bool bData;
float fData;
char cData[CDATA_MAX];
};
// フラグタイプ
enum eFlagDataType {
eFLAG_DATA_TYPE_INT,
eFLAG_DATA_TYPE_BOOL,
eFLAG_DATA_TYPE_FLOAT,
eFLAG_DATA_TYPE_CHAR_8, // 7文字まで可
};
// データ
uFlagData uData; // フラグデータ
eFlagDataType eType; // フラグタイプ
// コンストラクタ
sFlagData(){}
sFlagData(int val) : eType(eFLAG_DATA_TYPE_INT) { this->uData.iData = val; }
sFlagData(bool val) : eType(eFLAG_DATA_TYPE_BOOL) { this->uData.bData = val; }
sFlagData(float val) : eType(eFLAG_DATA_TYPE_FLOAT) { this->uData.fData = val; }
sFlagData(const char *val) : eType(eFLAG_DATA_TYPE_CHAR_8)
{
assert(strlen(val) < CDATA_MAX); // エラーチェック (オーバーフロー)
strcpy(this->uData.cData, val); // 文字列代入
}
sFlagData(uFlagData val, eFlagDataType eType) : eType(eType) { uData = val; }
};
// FlagMgr --------------------
class FlagMgr {
std::vector<sFlagData> m_sDataList;
public:
void addVectorData(sFlagData data) { m_sDataList.push_back(data); };
std::vector<sFlagData> getFlagData() { return m_sDataList; };
};