Skip to end of metadata
Go to start of metadata

형태

  • MFC를 보게되면 두가지 형태의 매크로 : DECLAREIMPLEMENT
  • DECLARE 매크로는 클래스 에 위치하면서 구동의 선언을 의미하며 IMPLEMENT는 이선언에 해당하는 부분의 구동을 의미

사용예

class CTest : public CObject 
{ 
DECLARE_DYNAMIC(CTest); 
public: 
  : 
 void test(); 
} 

IMPLEMENT_DYNAMIC(CTest,CObject) 
void Test::test() 
{ 
  CTest *test = new CTest; 
  if(test->IsKindOf(RUNTIME_CLASS(Test)) 
   { 
          AfxMessageBox("같은 종류임"); 
  } 
} 

Test 라는 클래스에 DECLARE_DYNAMIC 매크로를 사용하여 CTest클래스를 정의하였고 이와 쌍으로 IMPLEMENT_DYNAMIC라는 매크로가 소스에서 사용

즉 CTest 라는 클래스는 다양한 형태로 변화되지만 CObjec클래스를 베이스 클래스로 설정된다는 의미

이렇게 설정하엿을때 RUNTIME_CLASS 매크로를 사용하여 CRuntimeClass로 변화될수 있으며 이렇게 됨으로써 비교를 할수 있게 됨.

위의 예에서 test라는 클래스가 CTest라는 클래스와 같은 종류인가를 확인하는 것입니다. 분명 같은 종류이기 때문에 메시지 박스가 출력될 것임.

그러나 DECLARE_DYNAMIC 매크로와 IMPLEMENT_DYNAMIC 매크로를 쌍으로 설정하지 않으면 위의 IsKindOf함수는 제대로 동작하지가 않음.

선언과 수행매크로

선언 매크로

수행 매크로

설명

DECLARE_DYNAMIC

IMPLEMENT_CYNAMIC

베이스 클래스로 부터 파생되어 변화된 클래스로 구동.

DECLARE_DYNCREATE

IMPLEMENT_DYNCREATE

CObject클래스로 부터 파생되어 다양한 형태의 클래스로 생성됨.

DECLARE_SERIAL

IMPLEMENT_SERIAL

CObject 클래스로 부터 파생된 다른 클래스와 연결 하도록 함.

DECLARE_MESSAGE_MAP

BEGIN_MESSAGE_MAP
END_MESSAGE_MAP

매시지 맵핑을 선언하고 수행매크로 사이에 설정된 메시지처리를 해당 클래스에서 구동.

이 매크로들이 발생되는 원인은 계층적으로 파생되어 클래스자체가 다양하게 변화되기 때문

이렇게 다양하게 변화되어도 현재 클래스의 기본적인 정보를 알아야 합니다. 이렇게 하기 위해서는 도대체 근원이 어디인가를 알아야 하는것.

마찬가지로 현재 복잡하게 파생된 여러 클래스들의 베이스 클래스가 무엇인가를 알아야만 이 클래스를 정확하게 구동할수 있는 것임. 이럴때 사용하는것이 매크로.

또한 이렇게 매크로로 정의를 해놓음으로써 CRuntimeClass클래스를 이용하거나 또는 RUNTIME_CLASS 매크로를 이용하여 클래스를 CObjec형태와 그외 여분의 정보로 분리할수 있게 됨.

  • No labels