【C++】こういう書き方はできませんか? 改善点や別方法を教えてください

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
クロガミ
記事: 2
登録日時: 4年前

【C++】こういう書き方はできませんか? 改善点や別方法を教えてください

#1

投稿記事 by クロガミ » 4年前

Dxライブラリで自作ゲーム作ってます。
自機や敵の親クラスとして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);
	}
};
このcheckHitAllObjectメソッドのようなことをしたいわけです。

しかし、実際は

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
最後に編集したユーザー クロガミ on 2015年7月22日(水) 11:17 [ 編集 1 回目 ]

Aozora0630
記事: 85
登録日時: 5年前
住所: 日本
連絡を取る:

Re: 【C++】こういう書き方はできませんか? 改善点や別方法を教えてください

#2

投稿記事 by Aozora0630 » 4年前

それはつまり、このプログラムで使用されているすべてのTDObjectオブジェクトを取得して、あたり判定をチェックするということですよね。

わざわざオブジェクト内にvector作ってメモリ容量を消費するより、オブジェクトの配列を作ってそれを参照すればいいのでは?

コード:

class Test{
   int abc;
   
   public void aaaa();
   public void bbbb(){
      //メソッドの処理
   };
};
Test tests[5];


void Test::aaaa(){
   for(int i=0;i<5;i++)tests[i].bbbb();
}
こうすれば、自分オブジェクト変数を参照出来ます。

YuO
記事: 941
登録日時: 9年前
住所: 東京都世田谷区

Re: 【C++】こういう書き方はできませんか? 改善点や別方法を教えてください

#3

投稿記事 by YuO » 4年前

静的なメンバ変数は,宣言とは別にどこかで定義を書かないといけません。
今回の場合だと,どこかのファイルに,

コード:

std::map<int, TDObject *> TDObject::objects;
int TDObject::nextID;
の2行がないといけません。
この定義がないので,シンボル未解決のエラーになっています。

クロガミ
記事: 2
登録日時: 4年前

Re: 【C++】こういう書き方はできませんか? 改善点や別方法を教えてください

#4

投稿記事 by クロガミ » 4年前

>>Aozora0630さん
オブジェクト群をグローバルに置くと言うことですかね。なるほど、確かにそれならいけそうです。
でもやっぱり関数を各位置がやや面倒ですね。C++の関数内部をクラス外に書くやり方苦手で・・・。

>>YuOさん
おお、コンパイル通りました!
なるほど、私の勉強不足でした・・・。 ありがとうございます。
とりあえずこれで開発進めてみます!

閉鎖

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