C++のクラスの使い方についての質問です。

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

C++のクラスの使い方についての質問です。

#1

投稿記事 by » 17年前

C++ のクラスについての質問です。

構成は最後に載せています。
色々と省いたので、必要なものがあった場合言って下さい。

Substance.hの
//戦略パート
void Strategy_situation();

//戦闘パート
void Battle_situation();

この二つを別のクラスを宣言して使用したいと考えたのですが、方法が思いつきません。
クラス名をStrategyとした時
コンストラクタを呼び出したときに
Strategy sg;
sg.situation();

と宣言して使用する方法は考え付いたのですが、
Strategy::situation();
と使用したいと考えています。
Strategy *sg= new Strategy();
で宣言しても、使用方法は
sg->situtaion();
となりますし、deleteもややこしいので使いたくありません。
Strategy::situation();
の形で使用する方法は無いでしょうか?
C++はほとんど理解できていないので、ご助力お願いします。
********* 構成 ******************************************************
//Main.cpp
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hp, LPSTR lpC, int nC){
	SetMainWindowText("テトリス Ver2.0");	//タイトル変更
	Substance *sub = new Substance();
	sub->doMainLoop();
	delete sub;
}
//substance.h
class Substance :public Frame{
	bool drawMain();	//画面パートの追加設定
	
	S_GAME_STATE s_g_state;	//現在の状態
	
	//戦略パート
	void Strategy_situation();
	
	//戦闘パート 
	void Battle_situation();
	
public:
	S_GAME_STATE setS_GameState(S_GAME_STATE state);
	Substance(){
		setS_GameState(BATTLE);
	}
};

//substance.cpp
bool Substance::drawMain(){
	switch(s_g_state){
	case STRATEGY:
		Strategy_situation();
		break;
	case BATTLE:
		Battle_situation();
		break;
	}
	return true;
}
//Frame.h
void Frame::doMainLoop(){
	(省略)
		switch(g_state){
		case GAME_TITLE:
			drawTitle();
			break;
		case GAME_MAIN:
			if( drawMain() == false){
				setGameState(GAME_OVER);
			}	
			break;
		case GAME_END:
			if( drawEnd() == false)
				frag=FALSE;
			break;
		case GAME_CLEAR:
			drawClear();
			break;
		case GAME_OVER:
			drawOver();
			break;
		case GAME_OPTION:
			drawOption();
			break;
		}
	(省略)
}

組木紙織

Re:C++のクラスの使い方についての質問です。

#2

投稿記事 by 組木紙織 » 17年前

状況が良くわかりませんが、
以下のように定義すれば求めているかたちで使えます。(表記だけ)
が、普通のメンバ関数と違うので、必要な場合以外は使わないほうがいいかと。
(というより普通に使おうと思っても使えないと思う)
class Strategy
{
  public:
  static  void situation();

};
//このようにして使う。
Strategy::situation()

組木紙織

Re:C++のクラスの使い方についての質問です。

#3

投稿記事 by 組木紙織 » 17年前

>コンストラクタを呼び出したときに
>Strategy sg;
>sg.situation();
>と宣言して使用する方法は考え付いたのですが、

sgはコンストラクタ内だけで使うオブジェクトですか?
そうでなければコンストラクタから出たときにスコープから外れるので気をつける必要があります。

一番スタンダードな使い方は
メンバ変数にStrategy sgを入れることだと思います。
その場合はsg.situation();
となりますが。

Justy

Re:C++のクラスの使い方についての質問です。

#4

投稿記事 by Justy » 17年前

>Strategy::situation();
>の形で使用する方法は無いでしょうか?
 クラスじゃなくても良ければ、名前空間を使ってもできます。
[color=#d0d0ff" face="monospace]namespace Strategy
{
    void situation();
}
[/color]

Re:C++のクラスの使い方についての質問です。

#5

投稿記事 by » 17年前

ご回答ありがとうございます。
返信遅れてすいません。


組木紙織さん
>class Strategy
>{
> public:
> static void situation();
>};
このように宣言した時、言っておられるとおり、うまく使用で居ません。

もう一つ質問なのですが、
>メンバ変数にStrategy sgを入れることだと思います。
>その場合はsg.situation();
の場合は、
class Substance :public Frame{
Strategy sg;
}:

で使用するとして、sgの消滅のタイミングはいつなのでしょうか?
Substance();はヒープ領域に存在するように設定しているはずなので、この関数が終了するまでsgは消滅しないのでしょうか?
良く分からないのでよろしくお願いします。

Justyさん
>クラスじゃなくても良ければ、名前空間を使ってもできます。
クラスでの使用がしたいと考えています。

組木紙織

Re:C++のクラスの使い方についての質問です。

#6

投稿記事 by 組木紙織 » 17年前

>sgの消滅のタイミングはいつなのでしょうか?

一言で言うと、メンバ変数はそのインスタンスの生存期間と同じです。
int WINAPI WinMain(HINSTANCE hI, HINSTANCE hp, LPSTR lpC, int nC){
	SetMainWindowText("テトリス Ver2.0");
	Substance *sub = new Substance();   //ここでStrategy sgの生成
	sub->doMainLoop();
	delete sub;                         //ここでStrategy sgの消去
}
この場合は構造体をポインタで扱ってるというイメージに近いかな。


Substance()はSubstanceクラスのコンストラクタなので関数だと思いますが、
関数だと明言されるとなんか違和感が。

yamahara

Re:C++のクラスの使い方についての質問です。

#7

投稿記事 by yamahara » 17年前

初めまして。
いつも、ROMってました……。

C++のクラスを使用して、サンプルゲームを作ってみました。
コンパイル環境はbcc++5.5です。

ループを格納するクラスを使っています。
ご参考までにどうぞ。☆

http://sansuido.jes.jp/game/test.zip

Re:C++のクラスの使い方についての質問です。

#8

投稿記事 by » 17年前

ご回答ありがとうございます。

>組木紙織さん
これで安心して使用できます。

**
>yamaharaさん

>cobject() : angle(0), color(0), range(0), speed(0), pos() {}
>class cshot : public cobject, public ccounter {
>cplayer() : shotInterval() {}
この3つの宣言方法の意味がまったくわからないので教えていただけないでしょうか?

>menu.loop()
これは何なんでしょうか?
cloopが基底クラスになっていたので、調べたのですが、パッケージが出てきました。
http://packages.debian.org/ja/source/etch/cloop
これのことでしょうか?

>cdata
と言うのも基底クラスなのですが、
http://otndnld.oracle.co.jp/document/pr ... parser.htm
に載っているCDATAのことなのでしょうか?

どちらも、よくわからなかったりしますが…(汗

Justy

Re:C++のクラスの使い方についての質問です。

#9

投稿記事 by Justy » 17年前

>この3つの宣言方法の意味がまったくわからないので教えていただけないでしょうか?
>cobject() : angle(0), color(0), range(0), speed(0), pos() {}
 クラスのコンストラクタとその実装です。
 ついでに初期化子によってメンバ変数 angle/color/range/speedを 0に、
posは cposクラスの引数なしのコンストラクタで初期化をしています。

コンストラクタ
http://www.02.246.ne.jp/~torutk/cxx/con ... index.html


>class cshot : public cobject, public ccounter {
 普通の多重継承です。
 cobjectクラスと ccounterクラスを継承して cshotを作っています。


>cplayer() : shotInterval() {}
 これもコンストラクタとその実装ですね。


>menu.loop()
>cloopが基底クラスになっていたので、調べたのですが、パッケージが出てきました。
>これのことでしょうか?
 全く関係ないと思います。
 cloopクラスは DXライブラリの一般的なループを構成する部分を抽象化したもので、
実行する内容を継承することで自由にすげ替えることができるようにしたクラスのようです。
 今回の場合は cmenuクラスのメンバ関数 draw()/exec()を 基底クラスの loop()内で
毎回実行しています。


>cdata
>に載っているCDATAのことなのでしょうか?
 全く関係ないと思います。
 cmenu/cdataにしても cを先頭に付けることでクラスであることを明示しているのだと
推察します。
 なので、ただの dataを表すクラスなのでしょう。


# VisualC++じゃコンパイル通らないんですね(^^

Re:C++のクラスの使い方についての質問です。

#10

投稿記事 by » 17年前

ありがとうございます。

何とか理解できたと思います。(意味が取れるという意味で…)

ご回答本当にありがとうございました。

閉鎖

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