重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

DATA_AとDATA_Bは基底クラスDATAを継承したものです。最初にAを更新し、その内部でAをBに切り替え、Bを更新します。

DATA *pData = new DATA_A;

while(1)
{
pData = pData->Update( pData );
if(pData == NULL)break;
}

これで今、DATA_AのUpdateの中身がこうなってまして、
{
...
delete pData;
pData = new DATA_B;
return pData;
}

DATA_Bがこうです。
{
...
delete pData;
return NULL;
}

pData = pData->Update( pData )と、3回もpDataを書くことに違和感を感じたんですが、DATA_AとDATA_Bを切り替えるのにもっとスムーズな方法はあるのでしょうか?

A 回答 (2件)

一応念のため書いておくと, まず最初に考えつくパターンは


DATA_A::Update や DATA_B::Update では「(必要なら) new するけど delete はしない」ようにして
if (DATA *ptmp = pData->Update()) {
delete pData;
pData = ptmp;
}else
break;
のような形. これだとタイミング的に new→delete になるので例外に対する安全性も増します. ここで std::shared_ptr を使うと
std::shared_ptr<DATA> pData;
....
if (! (pData = pData->Update()))
break;
に変わります (delete は std::shared_ptr<DATA>::operator = で自動的に行われるのでプログラムの字面から消える).
もっといえば, ラッパクラス
class Foo {
public:
....
void Update() { pData = pData->Update(); }
operator std::shared_ptr<DATA>() const { return pData; }
std::shared_ptr<DATA> operator ->() const { return operator std::shared_ptr<DATA>(); }
DATA &operator *() const { return *operator std::shared_ptr<DATA>(); }
bool operator !() const { return ! operator std::shared_ptr<DATA>(); }
private:
std::shared_ptr<DATA> pData;
};
を用意するという手もあって, ここまでやると
Foo data;
...
data.Update();
if (! data)
break;
だけですみます.
    • good
    • 0

ん~, なんでこんなことをしたいのかがよくわからないなぁ....


とりあえず std::shared_ptr でも使う?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
中身の違うDATAを更新し続けるような構造にしたいと思ったので・・・。段階を切り替えながら常に更新するような感じです。
聞いたことのない名前が出てきたのでちょっと調べてみます。

お礼日時:2010/01/06 13:23

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!