- ベストアンサー
C++静的クラスの役割
- C++で静的オブジェクトの役割について理解できない
- sObjからは静的メンバ関数と静的メンバ変数は呼び出せるが、他のメンバは呼び出せない
- sObjからメンバ変数(*hoge)を呼び出すことはできない
- みんなの回答 (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も,ローカル変数への参照を返すので問題です。 </無関係な話>
その他の回答 (4)
- Tacosan
- ベストアンサー率23% (3656/15482)
「sObjを定義してください。というエラーがでます。」って自分で書いているくらいだから, 定義すればいい. #2 にも書かれてるよね.
お礼
ありがとうございます。
- Tacosan
- ベストアンサー率23% (3656/15482)
「別枠で新たに質問」なんてしなくていいからあなたが「実際に」どう書いたのかを見せてほしい.
お礼
ありがとうございます。
補足
そういってくれると当方としては助かります。 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を定義してください。というエラーがでます。
- Yune-Kichi
- ベストアンサー率74% (465/626)
そもそも,staticなのはクラスではなく変数です。 つまり, static 型 sObj; という形の,型の部分にクラス定義が直接書かれているだけです。 これが名前空間直下 (大域名前空間含む) に書かれているのであれば, sObjのスコープがファイルスコープであることを示すstaticでしょう。 この場合,他のファイルでsObjを直接利用することができません。 また,これがヘッダファイルに書かれていてインクルードされた場合,各ファイルのsObjは別のインスタンスになります。 # C++ならstaticではなく無名名前空間を使った方がよいでしょう。 それに対して,これがクラスの中で書かれているのであれば, sObjがそのクラスの静的なメンバ変数であることを示すstaticになります。 この場合,どこかにsObjの定義が必要になります。
お礼
名前空間を使用して隠ぺいするという手段も参考になりました。 ありがとうございます。
補足
それに対して,これがクラスの中で書かれているのであれば, sObjがそのクラスの静的なメンバ変数であることを示すstaticになります。 この場合,どこかにsObjの定義が必要になります。 エラーをみると外部シンボル ""public: static class TemMem::HOGE TemMem::sObj" (?sObj@TemMem@@2VHOGE@1@A)" は未解決です。 とでるので定義しないといけないと思います。
- honor
- ベストアンサー率35% (25/71)
int a = 10; sObj.hoge = &a; cout << *sObj.hoge << endl; VC++2010だとこんな風に出来ましたが、呼び出せないとは具体的にどう呼び出せないのでしょうか。
補足
自分でも試してみたら動きました。 上記のクラスがインナークラスではない場合はメンバ変数は使えるようです。 実はこのクラスを別のクラスのインナークラスとして宣言してあるんです。そちらのほうが動かないんです。ややこしくて申し訳ない。 分かりやすくするために別枠で新たに質問しようと思います。
お礼
あと,const int &を返すFunc01も,ローカル変数への参照を返すので問題です。 ローカル変数を参照渡ししても意味ないですからね。 何も考えず、テストプログラムでそれを参照していました。 staticメンバ変数へのアクセスをインスタンスを使って書くのは混乱の元かと思います。 myClass.sObjではなく,TemMem::sObjと書く方がよいでしょう。 静的クラスであることを知らせるためにもそうしてほうがいいですよね。 参考になりました。
補足
TemMem::HOGE TemMem::sObj; こうやって書くんですね。 ネット使って調べてもなかなか載ってないんですよね。 静的インナークラスの定義って珍しいんですかね。