It's just like pok    version4


클래스 생성과정을 강제하기

 | 

매니저로 관리되는 클래스들의 생성과정을 Template Method 등으로 강제하면 ‘이곳에서 만들자’가 정해지므로 만드는것에만 집중할 수 있을것이다.

문제는 상속받아 쓰는 쪽에서 어떻게 이렇게 해라~ 를 강제시키는가인데.. 어떤면에서 상속가능한 객체를 힙에만 생성하기와 비슷한 문제이다.

일단 런타임시에 assert를 내는것으로 의도를 전하는데에 중심을 둔버전


class manager;
class managedInterface
{
friend class manager;
public:
managedInterface()
{
assert( CREATE_TEST == READY_TO_CREATE );
}
private:
enum CREATE_TEST_TYPE
{
READY_TO_CREATE = 0,
NEED_TO_SET
};
enum { MANAGED = 1 };
static CREATE_TEST_TYPE CREATE_TEST; 
protected:
// 추상
virtual void OnCreate() = 0;
};
// 할당이 아닌 초기화를 위해서는 반드시 앞에 타입을 붙여준다.
managedInterface::CREATE_TEST_TYPE managedInterface::CREATE_TEST = managedInterface::NEED_TO_SET;

class managedImpl : public managedInterface
{
public:
// 속성
// managedImpl 하고 싶은것들
void runAndGun(){}

private:
// 구현
virtual void OnCreate(){}
};

class manager
{
public:
template
T* getManaged()
{
managedInterface::CREATE_TEST = managedInterface::READY_TO_CREATE;
T* pType = new T;
assert(T::MANAGED);
managedInterface::CREATE_TEST = managedInterface::NEED_TO_SET;
return pType;
}

static manager& getInstance()
{
static manager a;
return a;
}
};

int main()
{
//이렇게 하면 어써션이 뜬다.
//managedImpl* p = new managedImpl;

//이렇게 하면 어써션이 안뜬다.
managedImpl* p = manager::getInstance().getManaged();
managedImpl* pp = manager::getInstance().getManaged();

// 다시 이렇게 하면 어써션이 뜬다.
//managedImpl* pp = new managedImpl;
return 0;
}

어쨌든 의도는 전해질 것이고.. 코드또한 무겁지 않으니.. 이방법을 써먹어 봐야겠다.


프로그래밍