반응형

http://blog.naver.com/kofpw?Redirect=Log&logNo=80142050098

 


복사http://blog.naver.com/kofpw/80142050098

 

 

MFC의 동적 객체 생성 방법을 공부하던 중, MFC의 메인이 되는 각 클래스, Doc, View, MainFrm은 App 클래스의 InitInstance() 함수를 통해 동적으로 생성되는데, 웃긴것은 각 클래스의 생성자가 protected로 지정되어있는데 버젓이 다른 클래스에서 접근하여 생성한다는 것이다.

 

이것에 대한 원리가 나와있길래 살펴봤다. 어려운 내용은 아니다.

 

우선 다음과 같은 코드가 있다고 하자.

 

#include <iostream>

using namespace std;

 

class Object

{

protected:

      Object() { cout << "생성자" << endl; }

 

public:

      ~Object() { cout << "소멸자" << endl; }

};

 

void main()

{

     Object obj;

}

 

실행해보면 당연히 에러가 난다. 생성자가 protected로 선언되어있어 외부에서 접근할 수 없기 때문이다.

그럼 어떻게 해야할까? 뭐 제일 간단한 방법은 public에 생성자를 선언하는 방법이지만, 그런 뻔한 방법 말고 여기서의 목적은 MFC에서 어떻게 protected 생성자가 버젓이 호출되는지 파헤치기 위함이니...

 

그럼 어떻게? 그럼 Object 객체를 생성시켜주는 public 함수를 하나 만들어 보는 것이다.

 

#include <iostream>

using namespace std;

 

class Object

{

protected:

      Object() { cout << "생성자" << endl; }

 

public:

      ~Object() { cout << "소멸자" << endl; }

     void CreateObject() { Object obj; }

};

 

void main()

{

     CreateObject();

}

 

또 당연히 에러가 난다. 메인함수에서 CreateObject()라고 쓰면 클래스의 멤버가 아닌 전역 함수를 찾기 때문이다. 하지만 그 어디를 봐도 CreateObject라는 이름을 가진 전역함수는 보이지 않는다. 따라서 CreateObject를 찾을 수 없다고 에러가 뜬다.

그렇다고 먼저처럼 Object 클래스를 생성하고 obj.CreateObject() 라고 할수도 없는 일이다. 생성자는 protected이니까..

 

여기서 떠오르는 것이 바로 static이다.

 

#include <iostream>

using namespace std;

 

class Object

{

protected:

      Object() { cout << "생성자" << endl; }

 

public:

      ~Object() { cout << "소멸자" << endl; }

     static void CreateObject() { Object obj; }

};

 

void main()

{

     Object::CreateObject();

}

 

클래스의 멤버 함수를 static으로 선언해버리면 클래스를 만들지 않고도 해당 함수를 호출 할 수 있게 된다. (static 함수는 메모리의 데이터 영역에 저장된다) 위 코드는 정상적으로 실행이 될 것이다. 그러나, static 함수에서 생성된 객체 obj는 지역 변수이므로, 함수가 종료되는 순간 소멸되어버릴 것이다. 함수가 무용지물이 되는 셈이다.

 

그럼 또 어떻게 해야할까? 뭐긴... 동적할당하면 되지~~

 

#include <iostream>

using namespace std;

 

class Object

{

protected:

      Object() { cout << "생성자" << endl; }

 

public:

      ~Object() { cout << "소멸자" << endl; }

     static Object* CreateObject() { return new Object; }

};

 

void main()

{

     Object* pObj = Object::CreateObject();

     delete pObj;

}

 

이렇게 하면 함수를 통해 생성한 객체를 받아와서 사용할 수 있게 된다.

 

결론은, MFC의 동적 객체 생성 방법도 이런 식으로 진행된다는 것이다. 다만, 그것이 표면적으로 드러나있지 않고 숨어있을뿐.....

[출처] Protected Constructor|작성자 쿨랜드


반응형

+ Recent posts