• ベストアンサー

unionで重複する同一変数とした場合

struct hoge { union { const unsigned int count; unsigned int __count; }; } 上記のstructで、count参照時はcountを、更新時は__countとする事で、何かいいことがあるのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • hitomura
  • ベストアンサー率48% (325/664)
回答No.1

count を使用している個所では値を更新していないことが保障されます。 ……と言いたいところですが、そんな保障はキャストによって簡単に破ることができます。 とはいえ、キャストしなければ参照のみの箇所と更新を行っている個所とを明確に分けることができるため、コーディング規約を遵守している開発現場では一理あるコードではあります。 まあ、C++ ならばこんな共用体を使うよりクラスで変数を囲ってゲッターとセッターを用意するのが筋なのですが。

v-north
質問者

お礼

早々のご回答ありがとうございます。ゲッターとセッターを分けることで、ゲッター時になにがしかの最適化でもするのかな。と深読みしたりして悩んでいました。 コーディング規約を遵守。ということで納得しました。ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語のビットフィールドで分からないところがありま

    union UNION { struct { unsigned int a :(32-8-5); // この部分 unsigned int b :8; unsigned int c :5; }BIT; }; 上記の「この部分」と書いてある行の意味を教えてください よろしくお願いします

  • static constメンバ変数(配列)の初期化について

    C++初心者です。 constメンバ変数の初期化について教えてください。 クラスの中に、static constメンバ変数(配列)を持ちたいのですが、 <コード1> class hoge { public : hoge(){}; virtual ~hoge(){}; static const int fuga[2] = {1, 2}; }; とすると、VC++ 2005では、 error C2059: 構文エラー : '{' error C2334: '{' の前に予期しないトークンがありました。関数の本体は無視されます というエラーが発生します。 何がいけないのでしょうか? また、下の様にするとOKでした。 <コード2> class hoge { public : hoge(){}; virtual ~hoge(){}; static const int fuga[2]; }; const int hoge::fuga[2] = {1,2}; こうすればコンパイルが通る事は分かったのですが、なぜこんな面倒な事をしないといけないのかが分かりません。 コード1では何がいけないのでしょうか? 以上、よろしくお願いします。

  • 異なる複数の構造体のスマートな使用方法

    構造体のビットフィールドを複数作成し、 条件によってどの構造体を使用するかを決定し データ取得しようとしています。 同じ型の構造体の配列はできますが、 異なる構造体が複数ある場合、配列のように 参照する方法はないでしょうか? スマートなやり方があれば、ご教授お願い致します。 以下、やろうとしていることの簡易版、 /* ----例----------------------------------*/ int test = 1; if( test == 1){ /* 構造体test01を使用し値参照 */ } else if( test == 2){ /* 構造体test02を使用し値参照 */ } else if( ........ /* 以下同じような処理 */ struct test01{ unsigned int bit01: 1; unsigned int bit02: 15; } struct test02{ unsigned int bit01: 2; unsigned int bit02: 14; } struct test03{ unsigned int bit01: 3; unsigned int bit02: 13; } /* 同様の構造体がつづく*/ /* --------------------------------------*/

  • プロジェクトを作った際のエラー

    VisualC++ 2005 Express Editionを使用してます win32コンソールアプリケーション - アプリケーション設定 - windowsアプリケーション この新しく作ったプロジェクトを何もいじらずにビルドすると __imp__EndPaint@8 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__BeginPaint@8 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DefWindowProcW@16 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DestroyWindow@4 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__DialogBoxParamW@20 が関数 "long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)" (?WndProc@@YGJPAUHWND__@@IIJ@Z) で参照されました。 test.obj : error LNK2019: 未解決の外部シンボル __imp__EndDialog@8 が関数 "int __stdcall About(struct HWND__ *,unsigned int,unsigned int,long)" (?About@@YGHPAUHWND__@@IIJ@Z) で参照されました。 C:\C++test\test\Debug\test.exe : fatal error LNK1120: 外部参照 19 が未解決です。 というエラーが出てしまいます 800文字オーバーしてしまうのでエラーの前半部分を消してあります この原因と解決方法を教えてください よろしくお願いします

  • VC++2008でのサンプルプログラムのビルド

    VC++2008を使用してWin32APIを使ったプログラムを動かしたいと思っている者です。 これまでC言語については多少学んできましたがC++を使用するのは初めてです。 まずはサンプルプログラムを動かそうと思い以下のソースを入力しました。 #include <windows.h> #include <tchar.h> int WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR pCmdLine, int showCmd) { MessageBox( NULL, _T("Hello World"), _T("メッセージ"), MB_OK ); return 0; } そしてこれをビルドしてみたところエラーメッセージがでてしまいうまくビルドできませんでした。 参考にしているHPはVC++2008での作業を推奨していたので、動作環境の違いなどではないと思うのですが… 初期設定等の問題になるのでしょうか?解決策があれば教えていただきたいです。 以下が表示されるエラーメッセージです。 1>1.obj : error LNK2028: 未解決のトークン (0A000044) "extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z) が関数 "extern "C" int __cdecl MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PB_W1I@Z) で参照されました。 1>1.obj : error LNK2019: 未解決の外部シンボル "extern "C" int __stdcall MessageBoxW(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBoxW@@$$J216YGHPAUHWND__@@PB_W1I@Z) が関数 "extern "C" int __cdecl MessageBox(struct HWND__ *,wchar_t const *,wchar_t const *,unsigned int)" (?MessageBox@@$$J0YAHPAUHWND__@@PB_W1I@Z) で参照されました。 1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\1\Debug\1.exe : fatal error LNK1120: 外部参照 2 が未解決です。

  • union共同体の使い方…

    typedef union {  A_FILE* aFile;  B_FILE* bFile; }C_FILE; 上記のようにunion共同体で2つの型を 対応するものを作りました。 ファイルをオープンするのに C_FILE file_Open( const char *filename); というI/Fを作りました。 でもファイルをクローズする時に ファイルハンドルを渡そうと思うのですが、 ファイルハンドルの引数をどっちの型が入っても よいようにしたいのですが。 int file_Close(C_FILE.aFile Fp) ←これでは意味がない… int file_Close(C_FILE Fp)  ←こういう使い方は出来ませんよね? ファイルオープン側に実体を持ったままで、 どっちの型が入ってもよいファイルクローズを行う I/Fを作るのは無理なのでしょうか。 やはり実体は呼びだす側にあるべきなのでしょうか?

  • リトルエンディアン→ビッグエンディアン

    (1)リトルエンディアン typedef struct recvData{  int a;  unsigned char b[16]; unsigned char c[8]; unsigned int d[4]; } recvData_t; recvData_t rData; (2)ビッグエンディアン typedef struct sendData{  int a;  unsigned int b[4]; unsigned int c[2]; unsigned int d[4]; } sendData_t; sendData_t sData; 上記のようなリトルエンディアンの構造体の各メンバのデータを、ビッグエンディアンの構造体の各メンバのデータにそれぞれ格納するには どうしたらよいでしょうか?

  • 任意の型のポインタを格納する場合

    構造体にて、任意の型のポインタを指定できるアドレス格納変数を作成し(下記 hoge_tのメンバaa) そこに任意の型(下記fuga1_t、fuga2_t)を指定できるようにしたいと思っております。 下記コードにて所望の動作ができておりますが、こういう場合はこういう書き方をするものだ、 というものがあればお教え下さい。 (または下記記載の通りで正しい場合はこの書き方で問題ない、などいただけると助かります) #include <stdio.h> ///////////////////子struct typedef struct{ long num; long test; }fuga2_t; typedef struct{ int num; int test; }fuga1_t; ////////////////////親struct typedef struct{ int *aa; //ここにfuga1、fuga2両方設定したい場合がある }hoge_t; int main(void){ hoge_t hoge1; hoge_t hoge2; fuga1_t fuga1; fuga2_t fuga2; //初期化 fuga1.test = 10; fuga2.test = 11; //代入 hoge1.aa = (int*)&fuga1; hoge2.aa = (int*)&fuga2; printf("%d \n", (((fuga1_t*)(hoge1.aa))->test)); printf("%ld \n", (((fuga2_t*)(hoge2.aa))->test)); return 0; }

  • const参照メンバを含む要素のvector

    久しぶりに趣味でプログラミングしてます。 const参照のメンバを含むオブジェクトを要素に持つvector って使えます? 下記はbcc32でコンパイルするとエラーが出ます。 _algobase.h 145:コンパイラは 'operator=' クラスの hoge を作成できない(関数 _STL::hoge * __copy<hoge *,hoge *,int>(hoge *,hoge *,hoge *,const random_access_iterator_tag &,int *) ) ちなみにv.clear();をコメントアウトするとコンパイルは通り実行も問題なくできます。 clear()の替わりにpop_back()としてもコンパイルは通り実行も問題なくできます。 コンパイラーのバグ?そもそもこんなことをしてはダメ? よろしくお願いします。 class hoge { public:  hoge(const int &i):_i(i){};  virtual ~hoge(){};  operator int () const {return _i;}  const int &_i; }; int main() {  int i1=1;  int i2=2;  hoge h1(i1);  hoge h2(i2);  std::vector<hoge > v;  v.push_back(h1);  v.push_back(h2);  v.clear();  std::vector<hoge >::iterator iter = v.begin();  while( iter != v.end() ){   std::cout << *iter << "\n";   ++iter;  }  return 0; }

  • MicroC コンパイラ 変数宣言

    MicroC コンパイラ 変数宣言について質問です BYTE tmp1; WORD tmp2; なる定義があったとして 変数型範囲はどの範囲になるのでしょう 下記の定義は見つかったのですが 上記は分かりません 変数型 バイト数 範囲 (unsigned) char 1 0 .. 255 signed char 1 - 128 .. 127 (signed) short (int) 1 - 128 .. 127 unsigned short (int) 1 0 .. 255 (signed) int 2 -32768 .. 32767 unsigned (int) 2 0 .. 65535 (signed) long (int) 4 -2147483648 .. 2147483647 unsigned long (int) 4 0 .. 4294967295 float 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038 long double 4 ±1.17549435082 * 10-38 .. ±6.80564774407 * 1038

このQ&Aのポイント
  • イジメの裁判の記事において、女子児童側が学校側と加害児童の保護者を相手に165万円の賠償を求めて提訴しています。
  • 通常、民事訴訟では非財産権上の請求など算定不能の場合の訴額は160万円ですが、この記事では165万円となっています。
  • 訴額を160万円ではなく165万円にした意図や意味については明確な情報はありませんが、予想では損害の程度や精神的苦痛の強さを反映させるために増額された可能性が考えられます。
回答を見る