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 연산자입니다. |
설명
이 클래스는 라이브러리 클래스(예: CFile
CObList
및)뿐만 아니라 작성하는 클래스에 대한 루트로도 사용됩니다. CObject
은 다음을 비롯한 기본 서비스를 제공합니다.
- Serialization 지원
- 런타임 클래스 정보
- 개체 진단 출력
- 컬렉션 클래스와의 호환성
CObject
는 여러 상속을 지원하지 않습니다. 파생 클래스에는 하나의 CObject
기본 클래스만 있을 수 있으며 CObject
계층 구조에서 가장 왼쪽에 있어야 합니다. 그러나 오른쪽 다중 상속 분기에 구조체 및 파생되지 않은 CObject
클래스가 있는 것은 허용됩니다.
클래스 구현 및 선언에서 CObject
선택적 매크로 중 일부를 사용하는 경우 파생의 주요 이점을 얻을 수 있습니다.
첫 번째 수준 매크로 및 DECLARE_DYNAMIC
IMPLEMENT_DYNAMIC
클래스 이름 및 계층 구조의 해당 위치에 대한 런타임 액세스를 허용합니다. 그러면 의미 있는 진단 덤프가 허용됩니다.
두 번째 수준 매크로 DECLARE_SERIAL
는 IMPLEMENT_SERIAL
첫 번째 수준 매크로의 모든 기능을 포함하며 개체를 "보관"과 "직렬화"할 수 있도록 합니다.
일반적으로 Microsoft Foundation 클래스 및 C++ 클래스를 파생하고 사용하는 CObject
방법에 대한 자세한 내용은 CObject 및 Serialization 사용을 참조하세요.
상속 계층 구조
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
이 개체의 클래스NULL
에 CRuntimeClass
해당하는 구조체에 대한 포인터입니다.
설명
각 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_DYNAMIC
IMPLEMENT_DYNCREATE
IMPLEMENT_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
라이브러리의 릴리스 버전의 경우 연산자는 연산 delete
new
자가 할당한 메모리를 해제합니다.
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;
}