[C++] 클래스 맴버 변수로 클래스 변수 등록시 생성자 호출 막는 방법
안녕하세요.
그 동안 줄곧 C로 개발하다가 이직 하면서 C++로 개발 하게 되어서 C++ 다시 한번 훓고 있는 중에 궁금한 점이 있어 질문 드립니다.
제목 그대로입니다. 클래스 내의 클래스 맴버 변수를 등록 하게 되면 클래스 생성시 생성자가 호출 되어 생성이 되어 버리게 됩니다. 제가 원하는 것은 등록만 해놓은 뒤 나중에 사용을 하려고 하는데 이와같이 사용할 수 있는 방법이 없을지 알고 싶습니다.
일단 아래 예제 코드 부터..
////////////////////////////////////////////////////////////////////////////////////
Class Test1{
public:
Test1(void)
{
printf("Test1 생성자 호출 \n");
}
};
Class Test2
{
public:
Test2(void)
{
printf("Test2 생성자 호출 \n" );
}
void func(void);
private:
Test1 t1; // Test1 클래스 형의 맴버 등록..
};
// 이곳에서 Test1 클래스의 객체를 생성 하고 싶습니다!
void Test2::func(void)
{
t1 = Test1(); //맴버 생성..
}
//////////////////////////////////////////////////////////////////////////////
대략 이런 경우 입니다.
Test2 내에 Test1형의 클래스 맴버를 선언 하게 되면, Test2 객체 생성시 생성자가 콜되면서 디폴트 생성자가 호출 되는 현상이 있습니다.
제가 원하는 것은 등록 만 해둔뒤 이후 Test2::func()에서 생성하기를 원합니다.
(포인터 타입으로 선언 후 new로 할당 하는 방법도 있지만 다른 방법이 없을까 해서 문의 드립니다.)
의견 부탁 드립니다.^.^
대부분의 경우 포인터를 쓰고 factory
대부분의 경우 포인터를 쓰고 factory method로 생성하는 방법을 쓰거나 아니면 멤버(여기서는 t1)를 참조로 합니다.
참조로 했을 경우는 Test2 ctor에서 Test1의 객체 참조를 넘겨 주어야하니 조금 제약이 될수도 있겠네요.
그리고 한가지 추가하자면 외부에서 직접 객체 생성하는 것을 막고싶다면 ctor를 private으로 두는 것도 고려해볼만 합니다.
무슨 특별한 현상이 아니라 원래 그렇고, 그렇게
무슨 특별한 현상이 아니라 원래 그렇고, 그렇게 되는게 맞습니다.
객체의 생성과 동시에 초기화가 되는 것은 객체 지향의 기본입니다.
객체를 생성만 하고 초기화를 하지 않는다는 것은, 객체의 내부 구조를 객체의 외부에서 관리하겠다는 셈이니까요.
그런거에 특화된 특별한 관계의 클래스가 아닌한, 이런 사용법은 비정상적인 사용법입니다.
초기화를 늦추고 싶다면 객체 생성 자체를 늦춰야 하고, 그런 경우는 동적할당을 하면 되겠지요.
메모리 누수가 걱정이라면 소멸자에서 적절한 때에 해제해주거나 스마트 포인터를 쓰시면 되구요.
gilgil.net
원하는 답변이 될지 모르겠지만 singleton, lazy initialization에 대해서 살펴 보시기 바랍니다.
http://www.gilgil.net/15751 singleton 클래스 이야기(1)
http://www.gilgil.net/15772 singleton 클래스 이야기(2)
http://www.gilgil.net/15792 singleton 클래스 이야기(3)
http://www.gilgil.net/15809 singleton 클래스 이야기(4)
www.gilgil.net
댓글 달기