静的メンバを各クラス独自のものとして継承したい

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

静的メンバを各クラス独自のものとして継承したい

#1

投稿記事 by 山崎 » 16年前

毎度お世話になっております、山崎です。
今回は、静的メンバの継承についてお伺いに参りました。

現在、敵キャラクラスを作っております。
敵に共通したメンバやメソッドをEnemyクラスにまとめ親クラスとし、
それを継承した子クラスが個々の敵キャラとなるように作っております。

全ての敵キャラのインスタンスが同じグラフィックの領域を確保する必要も無いので、
子クラスの静的メンバにグラフィックの領域を確保し、共有させようと考えています。
そこで、親クラスのグラフィック用の静的メンバを継承させ、
各子クラスにもクラス別の静的メンバを持たせようと思ったのですが、
親クラスを継承した全ての子クラスで共有のメンバになってしまいます。

わかりにくいかもしれないので、以下に例を貼り付けます。
StaticMemberを、Parentを継承した各Childクラスに一つずつ持たせたいのですが、そうなりません。
#include <stdio.h>

class Parent
{
public:
	static short StaticMember;

	Parent()
	{
		printf("P  StaticMember = %hd\n",StaticMember);
	}

	void PrintMember()
	{
		printf("StaticMember = %hd\n",StaticMember);
	}
};
short Parent::StaticMember=1;

class Child1:public Parent
{
public:
	Child1()
	{
		StaticMember=StaticMember+10;
		printf("C1 StaticMember = %hd\n",StaticMember);
	}
};

class Child2:public Parent
{
public:
	Child2()
	{
		StaticMember=StaticMember+100;
		printf("C2 StaticMember = %hd\n",StaticMember);
	}
};

int main()
{
	Parent PIns;
	Child1 C1Ins1,C1Ins2;
	Child2 C2Ins1,C2Ins2;

	PIns.PrintMember();    // 1   になってほしい
	C1Ins1.PrintMember();  // 21  になってほしい
	C1Ins2.PrintMember();  // 21  になってほしい
	C2Ins1.PrintMember();  // 201 になってほしい
	C2Ins2.PrintMember();  // 201 になってほしい

	return 0;
}
------------------------------実行結果----------------------------------------
P StaticMember = 1
P StaticMember = 1
C1 StaticMember = 11
P StaticMember = 11
C1 StaticMember = 21
P StaticMember = 21
C2 StaticMember = 121
P StaticMember = 121
C2 StaticMember = 221
StaticMember = 221
StaticMember = 221
StaticMember = 221
StaticMember = 221
StaticMember = 221
------------------------------実行結果ここまで----------------------------------

静的メンバを、親クラスのメンバとは別のものとして継承する方法はあるのでしょうか?
それとも、静的メンバは継承した全ての子クラスで必ず共有しなければならないのでしょうか。

やはり、面倒がらずに各子クラスでも静的メンバを宣言しなければいけないのでしょうか。

たかぎ

Re:静的メンバを各クラス独自のものとして継承したい

#2

投稿記事 by たかぎ » 16年前

> やはり、面倒がらずに各子クラスでも静的メンバを宣言しなければいけないのでしょうか。

そういうことです。
継承はコーディングの手間を省くためのものではありません。

山崎

Re:静的メンバを各クラス独自のものとして継承したい

#3

投稿記事 by 山崎 » 16年前

>たかぎさん
とっても早いご返答、ありがとうございます。
やはり子クラスでも宣言しなければいけないのですか…。

いつの間にか、継承はコーディングの手間を省くためのものだと思うようになってました。

Justy

Re:静的メンバを各クラス独自のものとして継承したい

#4

投稿記事 by Justy » 16年前


>静的メンバを、親クラスのメンバとは別のものとして継承する方法はあるのでしょうか?

 妥当かどうかは置いておくとして、言語的には
[color=#d0d0ff" face="monospace]
template <class T>
class THogeHoge
{
protected:
static short StaticMember;
};

template <class T>
short THogeHoge<T>::StaticMember;

class Child1 : public Parent, public THogeHoge<Child1>
{
...
};
class Child2 : public Parent, public THogeHoge<Child2>
{
...
};
[/color]

とか
[color=#d0d0ff" face="monospace]
template <class T>
class THogeHoge : public Parent
{
protected:
static short StaticMember;
};

template <class T>
short THogeHoge<T>::StaticMember;

class Child1 : public THogeHoge<Child1>
{
...
};
class Child2 : public THogeHoge<Child2>
{
...
};
[/color]

という方法があります。

山崎

Re:静的メンバを各クラス独自のものとして継承したい

#5

投稿記事 by 山崎 » 16年前

>Justyさん
ご返信誠にありがとうございます。
なるほど、テンプレートを使うのですね…。
今まで一度もテンプレートを使ったことが無いので、非常に勉強になりました。
是非とも参考にさせていただきます。

閉鎖

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