みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C++ 静的クラスの役割が分からない

こんばんは。
C++で静的オブジェクトがなんなのか試しにプログラミングしているんですが
どんな役割があるのか試してもよく分かりません。
static class HOGE
{
public:
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;

sObjからは静的メンバ関数と静的メンバ変数は呼び出せるようです。他は呼び出せません。
そのようにするためにstatic宣言をするものなのでしょうか?
このsObjからメンバ変数(*hoge)を呼び出すことは無理なんでしょうか?

投稿日時 - 2014-07-20 23:39:46

QNo.8686223

すぐに回答ほしいです

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

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も,ローカル変数への参照を返すので問題です。
</無関係な話>

投稿日時 - 2014-07-22 12:28:30

補足

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

投稿日時 - 2014-07-23 22:45:23

お礼

あと,const int &を返すFunc01も,ローカル変数への参照を返すので問題です。

ローカル変数を参照渡ししても意味ないですからね。
何も考えず、テストプログラムでそれを参照していました。

staticメンバ変数へのアクセスをインスタンスを使って書くのは混乱の元かと思います。
myClass.sObjではなく,TemMem::sObjと書く方がよいでしょう。

静的クラスであることを知らせるためにもそうしてほうがいいですよね。
参考になりました。

投稿日時 - 2014-07-23 22:52:04

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

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

#2 にも書かれてるよね.

投稿日時 - 2014-07-22 12:28:17

お礼

ありがとうございます。

投稿日時 - 2014-07-23 22:41:59

ANo.3

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

投稿日時 - 2014-07-22 00:37:30

補足

そういってくれると当方としては助かります。

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を定義してください。というエラーがでます。

投稿日時 - 2014-07-22 11:01:15

お礼

ありがとうございます。

投稿日時 - 2014-07-22 11:10:13

ANo.2

そもそも,staticなのはクラスではなく変数です。
つまり,
static 型 sObj;
という形の,型の部分にクラス定義が直接書かれているだけです。

これが名前空間直下 (大域名前空間含む) に書かれているのであれば,
sObjのスコープがファイルスコープであることを示すstaticでしょう。
この場合,他のファイルでsObjを直接利用することができません。
また,これがヘッダファイルに書かれていてインクルードされた場合,各ファイルのsObjは別のインスタンスになります。
# C++ならstaticではなく無名名前空間を使った方がよいでしょう。

それに対して,これがクラスの中で書かれているのであれば,
sObjがそのクラスの静的なメンバ変数であることを示すstaticになります。
この場合,どこかにsObjの定義が必要になります。

投稿日時 - 2014-07-21 23:42:53

補足

それに対して,これがクラスの中で書かれているのであれば,
sObjがそのクラスの静的なメンバ変数であることを示すstaticになります。
この場合,どこかにsObjの定義が必要になります。

エラーをみると外部シンボル ""public: static class TemMem::HOGE TemMem::sObj" (?sObj@TemMem@@2VHOGE@1@A)" は未解決です。
とでるので定義しないといけないと思います。

投稿日時 - 2014-07-22 10:57:40

お礼

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

投稿日時 - 2014-07-22 10:58:28

ANo.1

int a = 10;
sObj.hoge = &a;
cout << *sObj.hoge << endl;

VC++2010だとこんな風に出来ましたが、呼び出せないとは具体的にどう呼び出せないのでしょうか。

投稿日時 - 2014-07-21 00:27:40

補足

自分でも試してみたら動きました。
上記のクラスがインナークラスではない場合はメンバ変数は使えるようです。

実はこのクラスを別のクラスのインナークラスとして宣言してあるんです。そちらのほうが動かないんです。ややこしくて申し訳ない。

分かりやすくするために別枠で新たに質問しようと思います。

投稿日時 - 2014-07-21 14:36:06

あなたにオススメの質問