コンストラクタについて

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

コンストラクタについて

#1

投稿記事 by EKISUKE » 13年前

以前作っていたプログラムはCppに全部まとめていたので処理ごとにCppとhに分けているのですが、
コンストラクタをメインプログラムで呼び出すにはどうしたらいいのでしょうか?
あとコンストラクタは初期化という風に考えていますが、考えはあっているでしょうか?
今やろうとしてることとしては

Basic.h

コード:

class Basic{
public:
	//! コンストラクタ
	Basic();
	//!	更新処理
	virtual void update();
	//! 描画処理
	virtual void draw();
	
protected:
	//! 座標
	Vector2 pos;
	//! 移動量
	Vector2 mov;
	//! 半径
	int radius;

};
Basic.cpp

コード:

Basic::Basic()
{
	pos._x = 0;
	pos._y = 0;
	mov._x = 0;
	mov._y = 0;
	radius = 0;
}
void Basic::update()
{
}

void Basic::draw()
{
}
circle.h

コード:

class Circle : public Basic{

public:
	//! コンストラクタ
	Circle();
	//!	更新処理
	virtual void update();
	//! 描画処理
	virtual void draw();
private:
	Vector2 Mat_pos;	//!< 配列のポジション
	int goal_count;
	bool blow_possible;		//!< 吹き飛ばし可能かどうか
	bool action_possible;	//!< アクション可能かどうか
	bool goal_flag;			//!< ゴールしてるかどうか
	int stage;				//!< ステージ切り替え

};
circle.cpp

コード:

Circle::Circle()
{
	pos._x = 0;
	pos._y = 0;
	mov._x	  = 0;
	mov._y	  = 0;
	radius = 15;
	goal_count = 0;
	blow_possible   = false;
	action_possible = false;
	goal_flag	   = false;
}

void Circle::update()
{
}
void Circle::draw()
{
}
Game.h

コード:

class testApp : public ofBaseApp{
	Circle				circle;		// 玉クラス
	public:

		void setup();
		void update();
		void draw();

		void keyPressed  (int key);
		void keyReleased(int key);
		void mouseMoved(int x, int y );
		void mouseDragged(int x, int y, int button);
		void mousePressed(int x, int y, int button);
		void mouseReleased(int x, int y, int button);
		void windowResized(int w, int h);
		void dragEvent(ofDragInfo dragInfo);
		void gotMessage(ofMessage msg);
		
};

Game.cpp

コード:

void testApp::setup(){

}
↑のsetup内でCircleのコンストラクタを呼び出して初期化ということはできないのでしょうか?
必要のないようなソースは省いたので、必要なものがあったら教えてください。

#includeは一つのヘッダファイルにまとめてそれぞれのCppで読み込んでいます。

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: コンストラクタについて

#2

投稿記事 by softya(ソフト屋) » 13年前

コンストラクタはインスタンスが生成された時に呼び出されますので、testApp のクラスにあるCircleはtestApp のインスタンス生成時に呼び出されますね。

それよりもclass testAppにいろんな機能な詰め込んであるほうが気になります。
C言語ではないので汎用機能クラスは避けたほうが良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

EKISUKE
記事: 108
登録日時: 13年前

Re: コンストラクタについて

#3

投稿記事 by EKISUKE » 13年前

softya(ソフト屋) さんが書きました:コンストラクタはインスタンスが生成された時に呼び出されますので、testApp のクラスにあるCircleはtestApp のインスタンス生成時に呼び出されますね。

それよりもclass testAppにいろんな機能な詰め込んであるほうが気になります。
C言語ではないので汎用機能クラスは避けたほうが良いでしょう。
なるほどsetupでそういう処理は特に行わなくても大丈夫なんですね。
testAppの中の処理も分けていきたいと思っていますが、プロジェクトを作った時から作られているものだったので分けていいのかわからないです。
それと、書いている関数で使っていないものもあるので、消すといいかと思います。
Game.hとGame.cppでゲームのメインシステムにしようと思っていますが、それでももっと機能を削減すべきでしょうか?
使っていないのを消すだけではだめでしょうか?

アバター
softya(ソフト屋)
副管理人
記事: 11677
登録日時: 15年前
住所: 東海地方
連絡を取る:

Re: コンストラクタについて

#4

投稿記事 by softya(ソフト屋) » 13年前

オブジェクト指向における基本原則は「単一の機能」にするです。クラスの機能の明確化ですね。
なので、キーやマウスは入力クラスで管理すべきです。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

EKISUKE
記事: 108
登録日時: 13年前

Re: コンストラクタについて

#5

投稿記事 by EKISUKE » 13年前

わかりました。
やってみます。回答有難うございました。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: コンストラクタについて

#6

投稿記事 by ISLe » 13年前

testAppはOpenFrameworksのアプリケーションフレームワーククラスで、メンバ関数はシステムのイベントコールバック用なので、変更できないと思いますけど。
実装を分離しろということなら提示されたコード量程度では分からないというか、むしろきちんとできているというか。

閉鎖

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