클래스 생성과정을 강제하기
2007/05/04 00:02
매니저로 관리되는 클래스들의 생성과정을 Template Method 등으로 강제하면 '이곳에서 만들자'가 정해지므로 만드는것에만 집중할 수 있을것이다.
문제는 상속받아 쓰는 쪽에서 어떻게 이렇게 해라~ 를 강제시키는가인데.. 어떤면에서 상속가능한 객체를 힙에만 생성하기와 비슷한 문제이다.
일단 런타임시에 assert를 내는것으로 의도를 전하는데에 중심을 둔버전
어쨌든 의도는 전해질 것이고.. 코드또한 무겁지 않으니.. 이방법을 써먹어 봐야겠다.
문제는 상속받아 쓰는 쪽에서 어떻게 이렇게 해라~ 를 강제시키는가인데.. 어떤면에서 상속가능한 객체를 힙에만 생성하기와 비슷한 문제이다.
일단 런타임시에 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;
}
어쨌든 의도는 전해질 것이고.. 코드또한 무겁지 않으니.. 이방법을 써먹어 봐야겠다.
Trackback Address:http://poksion.cafe24.com/poklog/trackback/45