自機や敵の親クラスとしてTDObjectというクラスを作成したのですが、
このクラス内で、現存するTDObjectオブジェクトを全て把握し、それを利用したメソッドを作成したいと考えています。
以下が現在のソースです。
#ifndef TDOBJECT_H_
#define TDOBJECT_H_
#include "DxLib.h"
#include "defines.h" //このプロジェクトの定数/構造体群
#include "curcurate.h" //このプロジェクトの汎用関数群
#include <map>
class TDObject{
private:
static std::map<int ,TDObject *> objects; //現存するオブジェクトのまとめ
static int nextID; //次に割り当てるID
protected:
int ID;
int MaxHP;
int HP;
side aSide;
point_double aPoint;
double size;
bool isJama;
int graph;
public:
/*
* コンストラクタ。IDを割り振って、オブジェクト群に加える。
*/
TDObject(){
ID = nextID;
objects[ID] = this;
nextID++;
}
/*
* 引数の座標がオブジェクト範囲内かどうかを返す
*/
bool checkContain(point_double target){
return CheckContain(target,aPoint.x-size/2,aPoint.y-size/2,aPoint.x+size/2,aPoint.y+size/2);
}
/*
* オブジェクト同士の当たり判定
*/
bool checkHitObject(TDObject otherObject){
return checkContain(otherObject.aPoint) || otherObject.checkContain(aPoint);
}
/*
* オブジェクト全てとの当たり判定
*/
bool checkHitAllObject(){
int num = objects.size();
for(int i = 0; i < num; i ++){
TDObject aObject = *objects.at(i);
if(ID != aObject.ID){
if(checkHitObject(aObject)) return true;
}
}
return false;
}
/*
* オブジェクトを描画。 必要によりオーバーライドして変更
*/
void draw(int wX,int wY){
DrawGraph(wX,wY,graph,true);
}
/*
* ダメージを受ける
*/
void damage(int aDamage){
HP -= aDamage;
}
/*
* このオブジェクトとおさらばするとき、オブジェクト群から削除する。 デストラクタでも大丈夫か・・・?
*/
void erace(){
objects.erase(ID);
}
};
しかし、実際は
1>main.obj : error LNK2001: 外部シンボル ""private: static class std::map<int,class TDObject *,struct std::less<int>,class std::allocator<struct std::pair<int const ,class TDObject *> > > TDObject::objects" (?objects@TDObject@@0V?$map@HPAVTDObject@@U?$less@H@std@@V?$allocator@U?$pair@$$CBHPAVTDObject@@@std@@@3@@std@@A)" は未解決です。
1>main.obj : error LNK2001: 外部シンボル ""private: static int TDObject::nextID" (?nextID@TDObject@@0HA)" は未解決です。
というエラーが出ます。 シンボル名を間違えたつもりはないのですが・・・。
改善点はありますか? 普通にこのプロジェクトのメイン処理クラスにオブジェクト群を配置したほうが楽かもしれませんね。
そもそも私のしょうもないミスか・・・。
回答お願いします。
#endif