Entry

プログラミングメモ - Factory パターンと std::auto_ptr の相性

2009年05月30日

Factory パターンと std::auto_ptr の相性がなかなかいいなと思って,雛形みたいなもんを書いてみました。こんな風に使ってる人は,割と多いんじゃないでしょうか。

#include <iostream>
#include <memory>

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif

/**
 * Item class created by SomeFactory.
 */
class SomeItem {
public:
    SomeItem() {}
    virtual ~SomeItem() {}
public:
    int getValue() const {
        return value_;
    }
    void setValue(int value) {
        value_ = value;
    }
private:
    int value_;
};

/**
 * Factory class that creates SomeItem
 */
class SomeFactory {
public:
    SomeFactory() {}
    virtual ~SomeFactory() {}
private:
    SomeFactory(const SomeFactory& other);
    SomeFactory& operator=(const SomeFactory& other);
public:
    std::auto_ptr<SomeItem> getItem(int value) {
        std::auto_ptr<SomeItem> someItem =
            std::auto_ptr<SomeItem>(new SomeItem());
        someItem->setValue(value);
        return someItem;
    }
};

/**
 * main routine.
 */
int
main(int argc, char* argv[]) {
    _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

    SomeFactory someFactory;
    std::auto_ptr<SomeItem> someItem = someFactory.getItem(100);
    std::cout << someItem->getValue() << std::endl;
    // no delete and no leak!

    char* ch = new char[100];
    // no delete and it leaks!
    //delete[] ch;

    return 0;
}

コードの最後にある char* ch 云々は,ちゃんとリーク検出が利いてるか確かめるためにつけただけです。それとこれ,VC6 で動きます。

他人のトコ(クラス)で new したオブジェクトを他のところで delete するってのは,責任の所在が曖昧になるのであまりやりたくないんですけれど,auto_ptr を使えば,受けた側で明示的に delete しなくても ::main() の someItem がスコープから外れたところで自動的に解放されます。

J2EE パターンにいわゆる DTO(Data Transfer Object)みたいなことを C++ で実装しようとすると,値渡しが頻発して効率が悪くなりがちなんですけれど,この方法なら,同じオブジェクトをそれぞれの権限で管理できるので便利便利。

今日は週末でヘロヘロなのでこれだけ。

Trackback
Trackback URL:
Ads
About
Search This Site
Ads
Categories
Recent Entries
Log Archive
Syndicate This Site
Info.
クリエイティブ・コモンズ・ライセンス
Movable Type 3.36
Valid XHTML 1.1!
Valid CSS!
ブログタイムズ

© 2003-2012 AIAN