オブジェクトの寿命を維持させる方法について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
華風えくれあ
記事: 25
登録日時: 13年前
住所: 岐阜県大垣市
連絡を取る:

オブジェクトの寿命を維持させる方法について

#1

投稿記事 by 華風えくれあ » 13年前

コード:

// 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フェイズに移ってからオブジェクトの生成をする方針ですので、
良いとは思えません。
ご教授よろしくお願いします。

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

Re: オブジェクトの寿命を維持させる方法について

#2

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

クラスポインタをstaticで保持するとかはダメでしょうか?(スマートポインタ推奨)
あとnowState もstaticにした方が良いでしょう。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

華風えくれあ
記事: 25
登録日時: 13年前
住所: 岐阜県大垣市
連絡を取る:

Re: オブジェクトの寿命を維持させる方法について

#3

投稿記事 by 華風えくれあ » 13年前

わかりました、こんな感じで良いのですね。

コード:

// 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宣言ってどうやってやるんですか?主に実体化の部分。

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

Re: オブジェクトの寿命を維持させる方法について

#4

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

とりあえず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です。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。

華風えくれあ
記事: 25
登録日時: 13年前
住所: 岐阜県大垣市
連絡を取る:

Re: オブジェクトの寿命を維持させる方法について

#5

投稿記事 by 華風えくれあ » 13年前

解決できました、ありがとうございます。

解決コード(乱暴書きで申し訳ない)

コード:

// 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
オブジェクトが破棄されました

beatle
記事: 1281
登録日時: 13年前
住所: 埼玉
連絡を取る:

Re: オブジェクトの寿命を維持させる方法について

#6

投稿記事 by beatle » 13年前

グローバル領域に変数を定義する設計自体がどうかとは思いますが、とりあえず
std::make_shared
を使ったほうが、std::shared_ptrのコンストラクタにnewしたオブジェクトを渡すよりいいですよ。

華風えくれあ
記事: 25
登録日時: 13年前
住所: 岐阜県大垣市
連絡を取る:

Re: オブジェクトの寿命を維持させる方法について

#7

投稿記事 by 華風えくれあ » 13年前

make_sharedですか・・・、使い方がよくわからないのですが
boost関連のリファレンスサイトを見てみて、

このような書き方でよろしいのでしょうか?

コード:

tObj01 = std::shared_ptr<TEST>(new TEST(/*引数*/));
// メモリ生成が二回

tObj02 = std::make_shared<TEST>(/*引数*/);
// メモリ生成一度のみ

閉鎖

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