ページ 1 / 1
オブジェクトの寿命を維持させる方法について
Posted: 2012年5月04日(金) 20:22
by 華風えくれあ
コード:
// main.cpp
int WINAPI WinMain(...)
{
// 略
while(...)
{
switch(func_state)
{
case STATE_DUNGEON:
dungeon();
break;
}
ScreenFlip();
}
// dungeonMain.cpp
int nowState = 0;
int dungeon( void )
{
switch(nowState)
{
case 0:
ClassDungeon dungObj;
nowState = 1;
break;
case 1: //以後各処理
break;
default:
break;
}
}
このようにmain関数とは別の関数でオブジェクトを作成した時に、関数終了時に
オブジェクトは破棄されてしまいますよね。
このような時にオブジェクトの寿命を破棄するまで維持させるにはどうすればよいのでしょうか。
静的変数を作成するのはdungeonフェイズに移ってからオブジェクトの生成をする方針ですので、
良いとは思えません。
ご教授よろしくお願いします。
Re: オブジェクトの寿命を維持させる方法について
Posted: 2012年5月04日(金) 21:29
by softya(ソフト屋)
クラスポインタをstaticで保持するとかはダメでしょうか?(スマートポインタ推奨)
あとnowState もstaticにした方が良いでしょう。
Re: オブジェクトの寿命を維持させる方法について
Posted: 2012年5月04日(金) 22:06
by 華風えくれあ
わかりました、こんな感じで良いのですね。
コード:
// Test.h
#ifndef __INCLUDE_TEST_H__
class TEST
{
public:
TEST() {}
~TEST(){}
int test_var;
};
#define __INCLUDE_TEST_H__
#endif
// Test.cpp
#include "../../include/TEST.h"
#include <memory>
static int nowState = 0;
static TEST* test;
int dungeon( void )
{
switch(nowState)
{
case 0:
test = new TEST();
nowState = 1;
break;
case 1:
delete test;
break;
default:
break;
}
return 0;
}
スマートポインタのstatic宣言ってどうやってやるんですか?主に実体化の部分。
Re: オブジェクトの寿命を維持させる方法について
Posted: 2012年5月04日(金) 22:22
by softya(ソフト屋)
とりあえずintで書きましたが、
static std::tr1::shared_ptr<int> int_ptr;
int_ptr = std::tr1::shared_ptr<int>(new int);
こんな感じです。VC++2008上で確認したのでtr1ですが2010ならtr1は不要です。
これをintの部分をクラスにすればOKです。
Re: オブジェクトの寿命を維持させる方法について
Posted: 2012年5月04日(金) 22:48
by 華風えくれあ
解決できました、ありがとうございます。
解決コード(乱暴書きで申し訳ない)
コード:
// Main.cpp
#include "TEST.h"
int main(void)
{
test_func();
return 0;
}
// Test.cpp(ヘッダーでmainとリンク済み)
#include <cstdio>
#include <memory>
class TEST
{
public:
TEST(int aX) : test_var(aX){}
~TEST();
int test_var;
};
static std::shared_ptr<TEST> tObj;
TEST::~TEST( void )
{
printf("オブジェクトが破棄されました\n");
}
int test_func( void )
{
for(int x=0;x<3;x++)
{
switch(x)
{
case 0:
tObj = std::shared_ptr<TEST>(new TEST(100));
break;
case 1:
printf("%d\n",tObj->test_var);
break;
case 2:
break;
}
}
return 0;
}
結果:
100\n
オブジェクトが破棄されました
Re: オブジェクトの寿命を維持させる方法について
Posted: 2012年5月05日(土) 08:21
by beatle
グローバル領域に変数を定義する設計自体がどうかとは思いますが、とりあえず
std::make_shared
を使ったほうが、std::shared_ptrのコンストラクタにnewしたオブジェクトを渡すよりいいですよ。
Re: オブジェクトの寿命を維持させる方法について
Posted: 2012年5月05日(土) 17:09
by 華風えくれあ
make_sharedですか・・・、使い方がよくわからないのですが
boost関連のリファレンスサイトを見てみて、
このような書き方でよろしいのでしょうか?
コード:
tObj01 = std::shared_ptr<TEST>(new TEST(/*引数*/));
// メモリ生成が二回
tObj02 = std::make_shared<TEST>(/*引数*/);
// メモリ生成一度のみ