ページ 11

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

Posted: 2014年2月26日(水) 11:10
by sql
龍神録の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していただけたら嬉しいです。

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

Posted: 2014年2月26日(水) 11:16
by h2so5
龍神録のコードはあまり整理されていないので鵜呑みにしないほうが良いと思います。
この場面でポインタで宣言するメリットはないですね。

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

Posted: 2014年2月26日(水) 11:26
by sql
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;とポインタで宣言されています。
これはなぜなのでしょうか?

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

Posted: 2014年2月26日(水) 11:38
by せんちゃ
既にご存知かもしれませんが、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領域の場合)スタックが足りなくなってアプリが起動しなくなる可能性があります。



ではなんでポインタにしたのかというのは書いた本人に聞かないとなんとも言えません

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

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

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

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

Posted: 2014年2月26日(水) 18:44
by Dixq (管理人)
ポインタにした理由は、オブジェクトをnewしてdeleteするというスタイルを統一したかったからです。
特に深い理由はありません。