つい先日も似たような質問をしてしまったので申し訳ないのですが、どうしてもわからないことがあるので教えてください
この前のフラグ変数の宣言場所について尋ねたトピックを解決状態にした後、フラグ変数についてネット上を調べ回りました(主にこの掲示板内ですが)
色々な情報があったのですがその中に一つよくわからない情報があって、
「フラグ変数は構造体に纏めた方がよい」
とのことでした
newをするときに一括でできて便利だから?・・・と、プログラマ初心者的には、そう考えたのですが正解は定かではありません
構造体で管理するとなにかいいことがあるのでしょうか?
ご教授よろしくお願いします
フラグ変数は構造体に纏めた方がよいのか
Re: フラグ変数は構造体に纏めた方がよいのか
前のトピックを読んでいませんので、話が見えてきませんが、わたしは、まとめるべきでないと思います。
言語が書いてありませんのでC++と仮定します。
「フラグをまとめる」という意味がよくわかりませんが、触れる必要がない変数には触らないようにすべきです。
たとえば、
という構造体があり、
のように、共通の変数(ここではフラグ変数)を構造体にまとめてしまう、というのなら大丈夫だと思いますが、
のように、グローバル変数にしてしまうのであれば、やめておいた方がよいでしょう。
言語が書いてありませんのでC++と仮定します。
「フラグをまとめる」という意味がよくわかりませんが、触れる必要がない変数には触らないようにすべきです。
たとえば、
struct Flags_t
{
bool bHoge;
bool bFoo;
bool bBaa;
Flags_t( bool hoge = false, bool foo = false, bool baa = false ) :
bHoge { hoge },
bFoo { foo },
bBaa { baa }
{
}
};
class ObjectA
{
Flags_t m_Flags;
public:
ObjectA() :
m_Flags {}
{
}
~ObjectA() {}
};
class ObjectB
{
Flags_t m_Flags;
public:
ObjectB() :
m_Flags {}
{
}
~ObjectB() {}
};
のように、グローバル変数にしてしまうのであれば、やめておいた方がよいでしょう。
オフトピック
フラグ変数をnewする、という方法を聞いたことがありません。データメンバにしてしまうので十分でしょう。T.K さんが書きました:newをするときに一括でできて便利だから?・・・と、プログラマ初心者的には、そう考えたのですが正解は定かではありません
初心者です
Re: フラグ変数は構造体に纏めた方がよいのか
>「フラグ変数は構造体に纏めた方がよい」
こういう前後関係の分からない抜き出された一文に関して質問されても意図を答えるのは至極困難でしょう.
そういう話がされていた場所へのリンクなどを示さないと答えられるわけがないとは思いませんか.
…という前置きの上で,とりあえず考えた場合,(それがフラグかどうかに関わらない気がしますが)
「纏まっていれば,纏めて扱うことができる」
という利点はあるのではないでしょうか.
例えば,(1)のばらばらな状態で,「3つのフラグに対して同様な処理をしたい」場合,同じことを3回書く必要が生じそうですが
配列になっていれば for で書いたりできますよね.
構造体になっていれば構造体同士の代入とかが便利かもしれません.
とか.
こういう前後関係の分からない抜き出された一文に関して質問されても意図を答えるのは至極困難でしょう.
そういう話がされていた場所へのリンクなどを示さないと答えられるわけがないとは思いませんか.
…という前置きの上で,とりあえず考えた場合,(それがフラグかどうかに関わらない気がしますが)
「纏まっていれば,纏めて扱うことができる」
という利点はあるのではないでしょうか.
//(1)ばらばら
bool FlagA, FlagB, FlagC;
//(2)配列でまとめた
bool Flags[3];
//(3)構造体でまとめた
struct SFlags
{
bool FlagA, FlagB, FlagC;
};
//(2+3)構造体の中に配列
struct SFlags_typeB
{
bool Flags[3];
};
//(4)unsigned charの8個あるbitでそれぞれのフラグを表していることにする
unsigned char PackedFlags; //いずれかのbitがそれぞれ FlagA,FlagB,FlagC として使われる
配列になっていれば for で書いたりできますよね.
構造体になっていれば構造体同士の代入とかが便利かもしれません.
struct SFlags{ bool FlagA, FlagB, FlagC; }; //(3)構造体でまとめた
//ファイルからフラグ群の状態を読み込んで,pDstResultが指す構造体に格納.
//※ただし,「読込処理が失敗した場合は,pDstResultの値は変更されない」
bool LoadFlagsFromFile( const char *FileName, SFlags *pDstResult )
{
SFlags LoadedResult; //読込作業用
//LoadedResult にファイルから読んだ結果を格納する
//途中でエラーがあった場合は return false する.
...
//全て上手くいったので読みこんだ結果を反映
*pDstResult = LoadedResult;
return true;
}