CObject 클래스

MFC 라이브러리의 주체 기본 클래스입니다.

구문

class AFX_NOVTABLE CObject

멤버

보호된 생성자

속성 설명
CObject::CObject 기본 생성자입니다.

공용 메서드

이름 설명
CObject::AssertValid 이 개체의 무결성을 검사합니다.
CObject::Dump 이 개체의 진단 덤프를 생성합니다.
CObject::GetRuntimeClass 이 개체의 CRuntimeClass 클래스에 해당하는 구조를 반환합니다.
CObject::IsKindOf 지정된 클래스에 대한 이 개체의 관계를 테스트합니다.
CObject::IsSerializable 이 개체를 serialize할 수 있는지 여부를 테스트합니다.
CObject::Serialize 보관 파일에서 개체를 로드하거나 저장합니다.

Public 연산자

이름 설명
CObject::operator delete 특수 delete 연산자입니다.
CObject::operator new 특수 new 연산자입니다.

설명

이 클래스는 라이브러리 클래스(예: CFileCObList및)뿐만 아니라 작성하는 클래스에 대한 루트로도 사용됩니다. CObject 은 다음을 비롯한 기본 서비스를 제공합니다.

  • Serialization 지원
  • 런타임 클래스 정보
  • 개체 진단 출력
  • 컬렉션 클래스와의 호환성

CObject 는 여러 상속을 지원하지 않습니다. 파생 클래스에는 하나의 CObject 기본 클래스만 있을 수 있으며 CObject 계층 구조에서 가장 왼쪽에 있어야 합니다. 그러나 오른쪽 다중 상속 분기에 구조체 및 파생되지 않은 CObject클래스가 있는 것은 허용됩니다.

클래스 구현 및 선언에서 CObject 선택적 매크로 중 일부를 사용하는 경우 파생의 주요 이점을 얻을 수 있습니다.

첫 번째 수준 매크로 및 DECLARE_DYNAMICIMPLEMENT_DYNAMIC클래스 이름 및 계층 구조의 해당 위치에 대한 런타임 액세스를 허용합니다. 그러면 의미 있는 진단 덤프가 허용됩니다.

두 번째 수준 매크로 DECLARE_SERIALIMPLEMENT_SERIAL첫 번째 수준 매크로의 모든 기능을 포함하며 개체를 "보관"과 "직렬화"할 수 있도록 합니다.

일반적으로 Microsoft Foundation 클래스 및 C++ 클래스를 파생하고 사용하는 CObject방법에 대한 자세한 내용은 CObjectSerialization 사용을 참조하세요.

상속 계층 구조

CObject

요구 사항

헤더afx.h:

CObject::AssertValid

이 개체의 무결성을 검사합니다.

virtual void AssertValid() const;

설명

AssertValid는 내부 상태를 검사 이 개체에 대한 유효성 검사 수행합니다. 라이브러리 AssertValid 의 디버그 버전에서 어설션이 실패한 줄 번호와 파일 이름을 나열하는 메시지로 프로그램을 어설션한 다음 종료할 수 있습니다.

사용자 고유의 클래스를 작성할 때 자신과 클래스의 AssertValid 다른 사용자에게 진단 서비스를 제공하도록 함수를 재정의해야 합니다. 재정의는 AssertValid 일반적으로 파생 클래스에 AssertValid 고유한 데이터 멤버를 검사 전에 해당 기본 클래스의 함수를 호출합니다.

AssertValid 함수이므로 const 테스트 중에 개체 상태를 변경할 수 없습니다. 사용자 고유의 파생 클래스 AssertValid 함수는 예외를 throw하지 말고 잘못된 개체 데이터를 검색하는지 여부를 어설션해야 합니다.

"유효성"의 정의는 개체의 클래스에 따라 달라집니다. 일반적으로 함수는 "단순 검사"을 수행해야 합니다. 즉, 개체에 다른 개체에 대한 포인터가 포함된 경우 포인터가 아닌지 NULL여부를 확인하기 위해 검사 하지만 포인터가 참조하는 개체에 대해 유효성 테스트를 수행해서는 안 됩니다.

예시

모든 CObject 예제에서 사용되는 클래스 목록을 CAge 참조 CObList::CObList 하세요.

void CAge::AssertValid() const
{
   CObject::AssertValid();
   ASSERT(m_years > 0); 
   ASSERT(m_years < 105);
}

다른 예제를 보려면 AfxDoForAllObjects를 참조하십시오.

CObject::CObject

이러한 함수는 표준 CObject 생성자입니다.

CObject();
CObject(const CObject& objectSrc);

매개 변수

objectSrc
다른 참조 CObject

설명

기본 버전은 파생 클래스의 생성자에 의해 자동으로 호출됩니다.

클래스를 serialize할 수 있는 경우(매크로를 통합) IMPLEMENT_SERIAL 클래스 선언에 기본 생성자(인수가 없는 생성자)가 있어야 합니다. 기본 생성자가 필요하지 않은 경우 프라이빗 또는 보호된 "빈" 생성자를 선언합니다. 자세한 내용은 사용을 참조하세요CObject.

표준 C++ 기본 클래스 복사 생성자는 멤버별 복사본을 수행합니다. 클래스의 복사 생성자가 필요하지만 사용할 수 없는 경우 프라이빗 CObject 복사 생성자가 있으면 컴파일러 오류 메시지가 보장됩니다. 클래스에 이 기능이 필요한 경우 복사 생성자를 제공합니다.

예시

예제에 사용된 CObject 클래스 목록을 CAge 참조 CObList::CObList 하세요.

// Create a CAge object using the default constructor.
CAge age1;

// Create a CAge object using the copy constructor.
CAge age2(age1);

CObject::Dump

개체의 내용을 개체에 CDumpContext 덤프합니다.

virtual void Dump(CDumpContext& dc) const;

매개 변수

dc
일반적으로 덤프에 대한 진단 덤프 컨텍스트입니다 afxDump.

설명

사용자 고유의 클래스를 작성할 때 자신과 클래스의 Dump 다른 사용자에게 진단 서비스를 제공하도록 함수를 재정의해야 합니다. 재정의된 Dump 경우 일반적으로 파생 클래스에 고유한 데이터 멤버를 Dump 인쇄하기 전에 기본 클래스의 함수를 호출합니다. CObject::Dump는 클래스에서 매크로 IMPLEMENT_SERIAL 를 사용하는 IMPLEMENT_DYNAMIC 경우 클래스 이름을 인쇄합니다.

참고 항목

Dump 함수는 출력의 끝에 줄 바꿈 문자를 인쇄해서는 안 됩니다.

Dump 호출은 Microsoft Foundation 클래스 라이브러리의 디버그 버전에서만 의미가 있습니다. 조건부 컴파일을 위해 문 #endif 과 함께 #ifdef _DEBUG대괄호로 묶은 호출, 함수 선언 및 함수 구현을 수행해야 합니다.

Dump 함수이므로 const 덤프 중에 개체 상태를 변경할 수 없습니다.

CDumpContext 포인터가 삽입될 때 insertion(<<) 연산자가 CObject 호출 Dump 됩니다.

Dump 는 개체의 "acyclic" 덤프만 허용합니다. 예를 들어 개체 목록을 덤프할 수 있지만 개체 중 하나가 목록 자체인 경우 결국 스택이 오버플로됩니다.

예시

모든 CObject 예제에서 사용되는 클래스 목록을 CAge 참조 CObList::CObList 하세요.

void CAge::Dump(CDumpContext& dc) const
{
   CObject::Dump(dc);
   dc << _T("Age = ") << m_years;
}

CObject::GetRuntimeClass

이 개체의 CRuntimeClass 클래스에 해당하는 구조를 반환합니다.

virtual CRuntimeClass* GetRuntimeClass() const;

Return Value

이 개체의 클래스NULLCRuntimeClass 해당하는 구조체에 대한 포인터입니다.

설명

CObject파생 클래스에 대해 하나의 CRuntimeClass 구조가 있습니다. 구조체 멤버는 다음과 같습니다.

  • LPCSTR m_lpszClassName ASCII 클래스 이름을 포함하는 null로 끝나는 문자열입니다.

  • int m_nObjectSize 개체의 크기(바이트)입니다. 개체에 할당된 메모리를 가리키는 데이터 멤버가 있는 경우 해당 메모리의 크기는 포함되지 않습니다.

  • UINT m_wSchema 스키마 번호(비직렬화할 수 없는 클래스의 경우 -1)입니다. IMPLEMENT_SERIAL 스키마 번호에 대한 설명은 매크로를 참조하세요.

  • CObject* (PASCAL* m_pfnCreateObject)() 클래스의 개체를 만드는 기본 생성자에 대한 함수 포인터입니다(클래스가 동적 생성을 지원하는 경우에만 유효하고, 그렇지 않으면 반환 NULL됨).

  • CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )() 애플리케이션이 MFC의 AFXDLL 버전에 동적으로 연결된 경우 기본 클래스의 구조를 반환 CRuntimeClass 하는 함수에 대한 포인터입니다.

  • CRuntimeClass* m_pBaseClass 애플리케이션이 MFC에 정적으로 연결된 경우 기본 클래스의 구조에 CRuntimeClass 대한 포인터입니다.

이 함수를 사용하려면 클래스 구현에서 IMPLEMENT_DYNAMICIMPLEMENT_DYNCREATEIMPLEMENT_SERIAL 또는 매크로를 사용해야 합니다. 그렇지 않으면 잘못된 결과를 얻을 수 있습니다.

예시

모든 CObject 예제에서 사용되는 클래스 목록을 CAge 참조 CObList::CObList 하세요.

CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);

CObject::IsKindOf

지정된 클래스에 대한 이 개체의 관계를 테스트합니다.

BOOL IsKindOf(const CRuntimeClass* pClass) const;

매개 변수

pClass
파생 클래스와 CObject연결된 구조체에 대한 포인터 CRuntimeClass 입니다.

Return Value

개체가 클래스에 해당하는 경우 0이 아닌 경우 그렇지 않으면 0입니다.

설명

이 함수는 pClass (1) 지정된 클래스의 개체인지 또는 (2) 지정된 클래스에서 파생된 클래스의 개체인지 여부를 테스트합니다. 이 함수는 , DECLARE_DYNCREATE또는 DECLARE_SERIAL 매크로로 선언된 클래스에 DECLARE_DYNAMIC대해서만 작동합니다.

이 함수는 C++ 다형성 기능을 사용하지 않으므로 광범위하게 사용하지 마세요. 대신 가상 함수를 사용합니다.

예시

모든 CObject 예제에서 사용되는 클래스 목록을 CAge 참조 CObList::CObList 하세요.

CAge a(21);  // Must use IMPLEMENT_DYNAMIC, IMPLEMENT _DYNCREATE, or
             // IMPLEMENT_SERIAL
ASSERT(a.IsKindOf(RUNTIME_CLASS(CAge)));
ASSERT(a.IsKindOf(RUNTIME_CLASS(CObject)));

CObject::IsSerializable

이 개체가 serialization에 적합한지 테스트합니다.

BOOL IsSerializable() const;

Return Value

이 개체를 serialize할 수 있는 경우 0이 아닌 경우 그렇지 않으면 0입니다.

설명

클래스를 serialize할 수 있게 하려면 해당 선언에 매크로가 DECLARE_SERIAL 포함되어야 하며 구현에는 매크로가 IMPLEMENT_SERIAL 포함되어야 합니다.

참고 항목

이 함수를 재정의하지 마세요.

예시

모든 CObject 예제에서 사용되는 클래스 목록을 CAge 참조 CObList::CObList 하세요.

CAge a(21);
ASSERT(a.IsSerializable());

CObject::operator delete

라이브러리의 릴리스 버전의 경우 연산자는 연산 deletenew자가 할당한 메모리를 해제합니다.

void PASCAL operator delete(void* p);

void PASCAL operator delete(
    void* p,
    void* pPlace);

void PASCAL operator delete(
    void* p,
    LPCSTR lpszFileName,
    int nLine);

설명

디버그 버전에서 연산 delete 자는 메모리 누수 감지를 위해 설계된 할당 모니터링 체계에 참여합니다.

코드 줄을 사용하는 경우

#define new DEBUG_NEW

의 구현 전에 . 이후 보고를 위해 할당된 블록에 파일 이름과 줄 번호를 저장하여 세 번째 버전의 delete CPP 파일을 사용합니다. 추가 매개 변수를 제공하는 것에 대해 걱정할 필요가 없습니다. 매크로가 이 작업을 처리합니다.

디버그 모드에서 사용하지 DEBUG_NEW 않더라도 위에서 설명한 소스 파일 줄 번호 보고가 없더라도 여전히 누출 검색이 발생합니다.

연산 new 자를 재정의하고 delete이 진단 기능을 몰수합니다.

예시

예제에 사용된 CObject 클래스 목록을 CAge 참조 CObList::CObList 하세요.

void CAge::operator delete(void* p)
{
   free(p);
}

void CAge::operator delete(void *p, LPCSTR lpszFileName, int nLine)
{
   UNREFERENCED_PARAMETER(lpszFileName);
   UNREFERENCED_PARAMETER(nLine);
   free(p);
}

CObject::operator new

라이브러리의 릴리스 버전의 경우 연산 new 자는 다음과 유사한 malloc방식으로 최적의 메모리 할당을 수행합니다.

void* PASCAL operator new(size_t nSize);
void* PASCAL operator new(size_t, void* p);

void* PASCAL operator new(
    size_t nSize,
    LPCSTR lpszFileName,
    int nLine);

설명

디버그 버전에서 연산 new 자는 메모리 누수 감지를 위해 설계된 할당 모니터링 체계에 참여합니다.

코드 줄을 사용하는 경우

#define new DEBUG_NEW

의 구현 전에 . CPP 파일은 두 번째 버전을 new 사용하여 나중에 보고하기 위해 할당된 블록에 파일 이름과 줄 번호를 저장합니다. 추가 매개 변수를 제공하는 것에 대해 걱정할 필요가 없습니다. 매크로가 이 작업을 처리합니다.

디버그 모드에서 사용하지 DEBUG_NEW 않더라도 위에서 설명한 소스 파일 줄 번호 보고가 없더라도 여전히 누출 검색이 발생합니다.

참고 항목

이 연산자를 재정의하는 경우 재정 delete의해야 합니다. 표준 라이브러리 _new_handler 함수를 사용하지 마세요.

예시

예제에 사용된 CObject 클래스 목록을 CAge 참조 CObList::CObList 하세요.

void* CAge::operator new(size_t nSize)
{
   return malloc(nSize);
}

void* CAge::operator new(size_t nSize, LPCSTR lpszFileName, int nLine)
{
   UNREFERENCED_PARAMETER(lpszFileName);
   UNREFERENCED_PARAMETER(nLine);
   return malloc(nSize);
}

CObject::Serialize

이 개체를 보관 저장소에서 읽어오거나 보관 저장소에 씁니다.

virtual void Serialize(CArchive& ar);

매개 변수

ar
CArchive 직렬화할 개체입니다.

설명

serialize하려는 각 클래스에 대해 재정 Serialize 의합니다. 재정의된 Serialize 함수는 먼저 기본 클래스의 함수를 Serialize 호출해야 합니다.

또한 클래스 선언에서 매크로를 DECLARE_SERIAL 사용해야 하며 구현에서 매크로를 IMPLEMENT_SERIAL 사용해야 합니다.

보관 파일이 로드 또는 저장 중인지 여부를 확인하거나 CArchive::IsStoring 사용합니다CArchive::IsLoading.

Serialize가 호출 CArchive::ReadObject 되고 .CArchive::WriteObject 이러한 함수는 삽입 연산자(<<) 및 추출 연산자(>>)와 연결 CArchive 됩니다.

serialization 예제는 개체 직렬화 문서를 참조하세요.

예시

모든 CObject 예제에서 사용되는 클래스 목록을 CAge 참조 CObList::CObList 하세요.

void CAge::Serialize(CArchive& ar)
{
   CObject::Serialize(ar);
   if(ar.IsStoring())
      ar << m_years;
   else
      ar >> m_years;
}

참고 항목

계층 구조 차트