• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C++ 静的クラスの役割が分からない)

C++静的クラスの役割

このQ&Aのポイント
  • C++で静的オブジェクトの役割について理解できない
  • sObjからは静的メンバ関数と静的メンバ変数は呼び出せるが、他のメンバは呼び出せない
  • sObjからメンバ変数(*hoge)を呼び出すことはできない

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

  • ベストアンサー
回答No.5

ANo.2で, > この場合,どこかにsObjの定義が必要になります。 と書きましたよね。 > エラーをみると外部シンボル ""public: static class TemMem::HOGE TemMem::sObj" (?sObj@TemMem@@2VHOGE@1@A)" は未解決です。 > とでるので定義しないといけないと思います。 ということまでわかっているのですから,ちゃんと定義すればよいです。 どこかの翻訳単位に, TemMem::HOGE TemMem::sObj; の一行を書くだけです。 <無関係な話> staticメンバ変数へのアクセスをインスタンスを使って書くのは混乱の元かと思います。 myClass.sObjではなく,TemMem::sObjと書く方がよいでしょう。 あと,const int &を返すFunc01も,ローカル変数への参照を返すので問題です。 </無関係な話>

DEADSPACE566
質問者

お礼

あと,const int &を返すFunc01も,ローカル変数への参照を返すので問題です。 ローカル変数を参照渡ししても意味ないですからね。 何も考えず、テストプログラムでそれを参照していました。 staticメンバ変数へのアクセスをインスタンスを使って書くのは混乱の元かと思います。 myClass.sObjではなく,TemMem::sObjと書く方がよいでしょう。 静的クラスであることを知らせるためにもそうしてほうがいいですよね。 参考になりました。

DEADSPACE566
質問者

補足

TemMem::HOGE TemMem::sObj; こうやって書くんですね。 ネット使って調べてもなかなか載ってないんですよね。 静的インナークラスの定義って珍しいんですかね。

その他の回答 (4)

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

「sObjを定義してください。というエラーがでます。」って自分で書いているくらいだから, 定義すればいい. #2 にも書かれてるよね.

DEADSPACE566
質問者

お礼

ありがとうございます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

「別枠で新たに質問」なんてしなくていいからあなたが「実際に」どう書いたのかを見せてほしい.

DEADSPACE566
質問者

お礼

ありがとうございます。

DEADSPACE566
質問者

補足

そういってくれると当方としては助かります。 class TemMem { public: static int val2; static int count; int val; public: static double math; public: TemMem() : val() {} public: static class HOGE { public: static int Array[2]; int *hoge; private: int value[2]; char moji[6]; public: HOGE() { cout << "HOGE\n"; } void MOJI() { strcpy(moji, "MOJI\n"); } void TEST() { cout << "moji = " << moji << endl; } static void staticMOJI() { } }sObj; double Func01(const double l) { double d = l + M_PI; return d; } const int &Func01() { int d = 0; return d; } HOGE hoge; }; 上記コードがそのクラスです。 このクラスで、 int a = 100; TemMem myclass; myclass.sObj.hoge = &a; ってやるとエラーです。 sObjを定義してください。というエラーがでます。

回答No.2

そもそも,staticなのはクラスではなく変数です。 つまり, static 型 sObj; という形の,型の部分にクラス定義が直接書かれているだけです。 これが名前空間直下 (大域名前空間含む) に書かれているのであれば, sObjのスコープがファイルスコープであることを示すstaticでしょう。 この場合,他のファイルでsObjを直接利用することができません。 また,これがヘッダファイルに書かれていてインクルードされた場合,各ファイルのsObjは別のインスタンスになります。 # C++ならstaticではなく無名名前空間を使った方がよいでしょう。 それに対して,これがクラスの中で書かれているのであれば, sObjがそのクラスの静的なメンバ変数であることを示すstaticになります。 この場合,どこかにsObjの定義が必要になります。

DEADSPACE566
質問者

お礼

名前空間を使用して隠ぺいするという手段も参考になりました。 ありがとうございます。

DEADSPACE566
質問者

補足

それに対して,これがクラスの中で書かれているのであれば, sObjがそのクラスの静的なメンバ変数であることを示すstaticになります。 この場合,どこかにsObjの定義が必要になります。 エラーをみると外部シンボル ""public: static class TemMem::HOGE TemMem::sObj" (?sObj@TemMem@@2VHOGE@1@A)" は未解決です。 とでるので定義しないといけないと思います。

  • honor
  • ベストアンサー率35% (25/71)
回答No.1

int a = 10; sObj.hoge = &a; cout << *sObj.hoge << endl; VC++2010だとこんな風に出来ましたが、呼び出せないとは具体的にどう呼び出せないのでしょうか。

DEADSPACE566
質問者

補足

自分でも試してみたら動きました。 上記のクラスがインナークラスではない場合はメンバ変数は使えるようです。 実はこのクラスを別のクラスのインナークラスとして宣言してあるんです。そちらのほうが動かないんです。ややこしくて申し訳ない。 分かりやすくするために別枠で新たに質問しようと思います。

関連するQ&A