フラグ変数は構造体に纏めた方がよいのか

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
T.K

フラグ変数は構造体に纏めた方がよいのか

#1

投稿記事 by T.K » 8年前

つい先日も似たような質問をしてしまったので申し訳ないのですが、どうしてもわからないことがあるので教えてください

この前のフラグ変数の宣言場所について尋ねたトピックを解決状態にした後、フラグ変数についてネット上を調べ回りました(主にこの掲示板内ですが)
色々な情報があったのですがその中に一つよくわからない情報があって、
「フラグ変数は構造体に纏めた方がよい」
とのことでした
newをするときに一括でできて便利だから?・・・と、プログラマ初心者的には、そう考えたのですが正解は定かではありません 
構造体で管理するとなにかいいことがあるのでしょうか?

ご教授よろしくお願いします

Rittai_3D
記事: 525
登録日時: 11年前

Re: フラグ変数は構造体に纏めた方がよいのか

#2

投稿記事 by Rittai_3D » 8年前

前のトピックを読んでいませんので、話が見えてきませんが、わたしは、まとめるべきでないと思います。
言語が書いてありませんので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() {}
};
のように、共通の変数(ここではフラグ変数)を構造体にまとめてしまう、というのなら大丈夫だと思いますが、

コード:

// a.hとかで
extern Flags_t gFlag;
のように、グローバル変数にしてしまうのであれば、やめておいた方がよいでしょう。
オフトピック
T.K さんが書きました:newをするときに一括でできて便利だから?・・・と、プログラマ初心者的には、そう考えたのですが正解は定かではありません
フラグ変数をnewする、という方法を聞いたことがありません。データメンバにしてしまうので十分でしょう。
初心者です

アバター
usao
記事: 1887
登録日時: 11年前

Re: フラグ変数は構造体に纏めた方がよいのか

#3

投稿記事 by usao » 8年前

>「フラグ変数は構造体に纏めた方がよい」

こういう前後関係の分からない抜き出された一文に関して質問されても意図を答えるのは至極困難でしょう.
そういう話がされていた場所へのリンクなどを示さないと答えられるわけがないとは思いませんか.


…という前置きの上で,とりあえず考えた場合,(それがフラグかどうかに関わらない気がしますが)
「纏まっていれば,纏めて扱うことができる」
という利点はあるのではないでしょうか.

コード:

//(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 として使われる
例えば,(1)のばらばらな状態で,「3つのフラグに対して同様な処理をしたい」場合,同じことを3回書く必要が生じそうですが
配列になっていれば 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;
}
とか.

閉鎖

“C言語何でも質問掲示板” へ戻る