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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
alice_coder

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

#1

投稿記事 by alice_coder » 13年前

あるクラスで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を使ったことがないので対処法がわかりません。
どなたか分かる方おしえてください。

nil
記事: 428
登録日時: 14年前

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

#2

投稿記事 by nil » 13年前

定義はMap* Chara::pmapです

赤鬼

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

#3

投稿記事 by 赤鬼 » 13年前

えーと、まず目に付くところから
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メンバ変数を実体を作っても未解決になる

#4

投稿記事 by 赤鬼 » 13年前

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

コード:

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

alice_coder

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

#5

投稿記事 by alice_coder » 13年前

赤鬼さん回答ありがとうございます。
指摘されたところを直したらエラーでなくなりました。
おかげで、すっきりしました。ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る