龍神録C++のmain文について

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

龍神録C++のmain文について

#1

投稿記事 by sql » 11年前

龍神録のC++版を見ながら勉強をしているのですがmain.cppが以下のようになっていました。

コード:

#include <DxLib.h>
#include "SystemMgr.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	CSystemMgr* pSystemMgr = new CSystemMgr;
	if( pSystemMgr->Initialize() ){
		pSystemMgr->MainLoop();
	}
	pSystemMgr->Finalize();
	delete pSystemMgr;
	return 0;
}
 
そして、これを以下のように変えて実行したところ問題なく動きました。

コード:

#include <DxLib.h>
#include "SystemMgr.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLine, int nCmdShow ){
	CSystemMgr pSystemMgr;// = new CSystemMgr;
	if( pSystemMgr.Initialize() )
	{
		pSystemMgr.MainLoop();
	}
	pSystemMgr.Finalize();
	//delete pSystemMgr;
	return 0;
}
 
要は、ポインタでの宣言でなくした、ということです。

ここで、ポインタで宣言するのはなぜなのでしょうか?パフォーマンス(処理速度)が速くなるのでしょうか?
理解に苦しんでいます。
他のコードはDLしていただけたら嬉しいです。

アバター
h2so5
副管理人
記事: 2212
登録日時: 14年前
住所: 東京
連絡を取る:

Re: 龍神録C++のmain文について

#2

投稿記事 by h2so5 » 11年前

龍神録のコードはあまり整理されていないので鵜呑みにしないほうが良いと思います。
この場面でポインタで宣言するメリットはないですね。

sql

Re: 龍神録C++のmain文について

#3

投稿記事 by sql » 11年前

h2so5さん、返信ありがとうございます。
初心者なので掲示されているコードの方がより正しいと思ってしまうので・・・・

もう一つ質問なのですが、mainloopのあるCSystemMgrクラスは

コード:

#ifndef DEF_SYSTEMMGR_H
#define DEF_SYSTEMMGR_H

#include "GameMgr.h"
#include "FpsCtrl.h"

class CSystemMgr{

	CGameMgr*	m_pGameMgr;
	CFpsCtrl*	m_pFpsCtrl;

public:

	CSystemMgr();
	~CSystemMgr();

	bool Initialize();
	void Finalize();
	void MainLoop();

};

#endif
のようにCGameMgr* m_pGameMgr;  CFpsCtrl* m_pFpsCtrl;とポインタで宣言されています。
これはなぜなのでしょうか?

アバター
せんちゃ
記事: 50
登録日時: 14年前
住所: 江別市東野幌町
連絡を取る:

Re: 龍神録C++のmain文について

#4

投稿記事 by せんちゃ » 11年前

既にご存知かもしれませんが、C++でクラスをポインタで宣言する理由としては不明なシンボル定義を通すためというのがよくある理由です。

コード:

class CGameMgr;
class CFpsCtrl;

class CSystemMgr{
    CGameMgr*   m_pGameMgr;
    CFpsCtrl*   m_pFpsCtrl;
public:
    CSystemMgr();
    ~CSystemMgr();
 
    bool Initialize();
    void Finalize();
    void MainLoop();
 
};
これは大丈夫ですが

コード:

class CGameMgr;
class CFpsCtrl;

class CSystemMgr{
    CGameMgr   m_pGameMgr;
    CFpsCtrl   m_pFpsCtrl;
public:
    CSystemMgr();
    ~CSystemMgr();
 
    bool Initialize();
    void Finalize();
    void MainLoop();
 
};
これは文法エラーです。
ただし今回のコードには定義されたクラス名のヘッダがインクルードされていることから
シンボル定義が解決されていると思うのでポインタにする必要はありません。
ただしヒープから取らないと(auto領域の場合)スタックが足りなくなってアプリが起動しなくなる可能性があります。



ではなんでポインタにしたのかというのは書いた本人に聞かないとなんとも言えません
ヽ(*゚д゚)ノ カイバー

sql

Re: 龍神録C++のmain文について

#5

投稿記事 by sql » 11年前

せんちゃさん返信ありがとうございます。
せんちゃ さんが書きました:ただしヒープから取らないと(auto領域の場合)スタックが足りなくなってアプリが起動しなくなる可能性があります。
を検証するために宣言をポインタでなくして、書き換えたら、ビルドは成功しましたが、exeファイルのアイコンをダブルクリックしてもアプリは起動しませんでした(ウィンドウすら出てきませんでした・・・)

おそらく、せんちゃさんの言うとおりアプリが起動しなくなるのを防ぐためなのかもしれません。
とても助かりました。

アバター
Dixq (管理人)
管理人
記事: 1662
登録日時: 14年前
住所: 北海道札幌市
連絡を取る:

Re: 龍神録C++のmain文について

#6

投稿記事 by Dixq (管理人) » 11年前

ポインタにした理由は、オブジェクトをnewしてdeleteするというスタイルを統一したかったからです。
特に深い理由はありません。

閉鎖

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