ページ 11

staticメンバ変数を実体を作っても未解決になる

Posted: 2012年7月27日(金) 15:26
by alice_coder
あるクラスでstatic メンバ変数と、そのメンバ変数を使用するstatic メンバ関数を作りました。
コンパイルするとstaticメンバ変数が未解決ですとでます。
ちゃんとヘッダに宣言して、実体をcppに書いています。
CharaクラスにMapクラス型のポインタをstaticにしたいんですが、コード省略してのせます

コード:

 
//ヘッダ
#include "Map.h"
class Chara
{
public:
    Chara::Chara(void);
    Chara::~Chara(void;
    static Map *pmap;
    static void set_pmap(Map);
}
//cpp
#include "Chara.h"
Map Chara::*pmap = 0;
void Chara::set_pmap(Map *set_pmap)
{
    pmap = set_pmap;//ここコメントアウトしたらエラーでなかった。
    return;
}
ちなみにset_pmap関数の部分をすべてコメントアウトしたらエラーは出なかったです。
pmapに代入しようとするとエラーがおきるようですが、staticを使ったことがないので対処法がわかりません。
どなたか分かる方おしえてください。

Re: staticメンバ変数を実体を作っても未解決になる

Posted: 2012年7月27日(金) 15:39
by nil
定義はMap* Chara::pmapです

Re: staticメンバ変数を実体を作っても未解決になる

Posted: 2012年7月27日(金) 15:56
by 赤鬼
えーと、まず目に付くところから
alice_coder さんが書きました: #include "Map.h"
class Chara
{
public:
Chara::Chara(void);
Chara::~Chara(void;
static Map *pmap;
static void set_pmap(Map);
};←セミコロン忘れてる
//cppのほう
Map Chara::*pmap = 0;           ←間違い、正しくはMap* Chara::pmap = 0;
void Chara::set_pmap(Map *set_pmap)
{
pmap = set_pmap;//ここコメントアウトしたらエラーでなかった。
return;
}
関数の定義の方と実体の方の型が違います。
static void set_pmap(Map);
void Chara::set_pmap(Map *set_pmap){}

あと、引数と関数名同じにするのはいただけません。関数ポインタを取りたい時に面倒です。
で、あと、pmap=set_pmapこれはできません。
なぜかと言うとpmapのスコープが無いからです。
書くとしたら
Char::pmap=set_pmapとなります

Re: staticメンバ変数を実体を作っても未解決になる

Posted: 2012年7月27日(金) 16:10
by 赤鬼
自分の回答を見てちょっと誤解を与えそうだったので、追記
static メンバ関数はスコープ指定が必須になります。
一応インスタンスを作って.でアクセスする事も可能です
例)

コード:

Chara chara;   //インスタンス生成
Map *map=NULL;
main(){
chara.set_pmap(map);    //←OK
chara::set_pmap(map);   //これもOK
}
ですが、普通はスコープを指定してやり、static関数だと示します。

Re: staticメンバ変数を実体を作っても未解決になる

Posted: 2012年7月27日(金) 18:23
by alice_coder
赤鬼さん回答ありがとうございます。
指摘されたところを直したらエラーでなくなりました。
おかげで、すっきりしました。ありがとうございました。