高校三年生の合唱祭で何を歌いましたか?

こんばんは。
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)を呼び出すことは無理なんでしょうか?

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

この回答への補足

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

補足日時:2014/07/23 22:45
    • good
    • 0
この回答へのお礼

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

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

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

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

お礼日時:2014/07/23 22:52

「sObjを定義してください。

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

#2 にも書かれてるよね.
    • good
    • 0
この回答へのお礼

ありがとうございます。

お礼日時:2014/07/23 22:41

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

この回答への補足

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

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
    • good
    • 1
この回答へのお礼

ありがとうございます。

お礼日時:2014/07/22 11:10

そもそも,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)" は未解決です。
とでるので定義しないといけないと思います。

補足日時:2014/07/22 10:57
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/07/22 10:58

int a = 10;


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

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

この回答への補足

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

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

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

補足日時:2014/07/21 14:36
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報