Classe CObject
A classe base principal da biblioteca Microsoft Foundation Class.
Sintaxe
class AFX_NOVTABLE CObject
Membros
Construtores Protegidos
Nome | Descrição |
---|---|
CObject::CObject |
Construtor padrão. |
Métodos públicos
Nome | Descrição |
---|---|
CObject::AssertValid |
Valida a integridade desse objeto. |
CObject::Dump |
Produz um despejo de diagnóstico desse objeto. |
CObject::GetRuntimeClass |
Retorna a estrutura CRuntimeClass correspondente à classe desse objeto. |
CObject::IsKindOf |
Testa a relação desse objeto com uma determinada classe. |
CObject::IsSerializable |
Testa se esse objeto pode ser serializado. |
CObject::Serialize |
Carrega ou armazena um objeto de/para um arquivo. |
Operadores públicos
Nome | Descrição |
---|---|
CObject::operator delete |
Operador delete especial. |
CObject::operator new |
Operador new especial. |
Comentários
Ele serve como a raiz não apenas para classes de biblioteca como CFile
e CObList
, mas também para as classes que você escreve. CObject
fornece serviços básicos, incluindo
- Suporte à serialização
- Informações da classe runtime
- Saída de diagnóstico do objeto
- Compatibilidade com classes de coleção
O CObject
não dá suporte a várias heranças. Suas classes derivadas podem ter apenas uma classe base CObject
e essa CObject
deve ser deixada mais à esquerda na hierarquia. É permitido, no entanto, ter estruturas e classes não derivadas de CObject
em ramificações de herança múltipla à direita.
Você perceberá os principais benefícios da derivação de CObject
se usar algumas das macros opcionais em sua implementação e declarações de classe.
As macros de primeiro nível DECLARE_DYNAMIC
e IMPLEMENT_DYNAMIC
permitem o acesso em tempo de execução ao nome da classe e à sua posição na hierarquia. Isso, por sua vez, permite um significativo despejo de diagnóstico.
As macros de segundo nível DECLARE_SERIAL
e IMPLEMENT_SERIAL
incluem todas as funcionalidades das macros de primeiro nível, e permitem que um objeto seja "serializado" de e para um "arquivo".
Para obter informações sobre como derivar classes do Microsoft Foundation e classes C++ em geral e usar CObject
, consulte Usar CObject e Serialização.
Hierarquia de herança
CObject
Requisitos
Cabeçalho: afx.h
CObject::AssertValid
Valida a integridade desse objeto.
virtual void AssertValid() const;
Comentários
AssertValid
executa uma verificação de validade nesse objeto verificando seu estado interno. Na versão de depuração da biblioteca, AssertValid
pode confirmar e, em seguida, encerrar o programa com uma mensagem que lista o número de linha e o nome do arquivo em que a declaração falhou.
Ao escrever sua própria classe, você deve substituir a função AssertValid
para fornecer serviços de diagnóstico para você e outros usuários da sua classe. O AssertValid
substituído geralmente chama a função AssertValid
de sua classe base antes de verificar membros de dados exclusivos para a classe derivada.
Como AssertValid
é uma função const
, você não tem permissão para alterar o estado do objeto durante o teste. Suas próprias funções AssertValid
de classe derivadas não devem gerar exceções, mas devem confirmar se detectam dados de objeto inválidos.
A definição de "validade" depende da classe do objeto. Como regra, a função deve fazer uma "verificação superficial". Ou seja, se um objeto contiver ponteiros para outros objetos, ele deverá verificar se os ponteiros não são NULL
, mas não deve fazer testes de validade nos objetos referenciados pelos ponteiros.
Exemplo
Consulte CObList::CObList
para obter uma listagem da classe CAge
usada em todos os exemplos CObject
.
void CAge::AssertValid() const
{
CObject::AssertValid();
ASSERT(m_years > 0);
ASSERT(m_years < 105);
}
Para outro exemplo, consulte AfxDoForAllObjects
.
CObject::CObject
Essas funções são os construtores CObject
padrão.
CObject();
CObject(const CObject& objectSrc);
Parâmetros
objectSrc
Uma referência a outro CObject
Comentários
A versão padrão é chamada automaticamente pelo construtor da classe derivada.
Se a classe for serializável (incorpora a macro IMPLEMENT_SERIAL
), você deverá ter um construtor padrão (um construtor sem argumentos) na declaração de classe. Se você não precisar de um construtor padrão, declare um construtor "vazio" privado ou protegido. Para obter mais informações, consulte Usar CObject
.
O construtor de cópia de classe padrão C++ padrão faz uma cópia membro por membro. A presença do construtor de cópia CObject
privado garante uma mensagem de erro do compilador se o construtor de cópia da sua classe for necessário, mas não estiver disponível. Forneça um construtor de cópia se sua classe exigir essa funcionalidade.
Exemplo
Consulte CObList::CObList
para obter uma listagem da classe CAge
usada em nos exemplos CObject
.
// Create a CAge object using the default constructor.
CAge age1;
// Create a CAge object using the copy constructor.
CAge age2(age1);
CObject::Dump
Despeja o conteúdo do objeto em um objeto CDumpContext
.
virtual void Dump(CDumpContext& dc) const;
Parâmetros
dc
O contexto do despejo de diagnóstico para despejo, geralmente afxDump
.
Comentários
Ao escrever sua própria classe, você deve substituir a função Dump
para fornecer serviços de diagnóstico para você e outros usuários da sua classe. O Dump
substituído geralmente chama a função Dump
de sua classe base antes de imprimir membros de dados exclusivos para a classe derivada. CObject::Dump
imprimirá o nome da classe se sua classe usar a macro IMPLEMENT_DYNAMIC
ou IMPLEMENT_SERIAL
.
Observação
Sua função Dump
não deve imprimir um caractere de nova linha no final de sua saída.
Chamadas Dump
só fazem sentido na versão de depuração da biblioteca Microsoft Foundation Class. Você deve fazer chamadas entre colchetes, declarações de função e implementações de função com instruções #ifdef _DEBUG
, #endif
para compilação condicional.
Como Dump
é uma função const
, você não tem permissão para alterar o estado do objeto durante o despejo.
O operador (<<) de inserção CDumpContext
chama Dump
quando um ponteiro CObject
é inserido.
Dump
permite apenas o despejo "acíclico" de objetos. Você pode despejar uma lista de objetos, mas se, por exemplo, um dos objetos for a própria lista, você acabará por estourar a pilha.
Exemplo
Consulte CObList::CObList
para obter uma listagem da classe CAge
usada em todos os exemplos CObject
.
void CAge::Dump(CDumpContext& dc) const
{
CObject::Dump(dc);
dc << _T("Age = ") << m_years;
}
CObject::GetRuntimeClass
Retorna a estrutura CRuntimeClass
correspondente à classe desse objeto.
virtual CRuntimeClass* GetRuntimeClass() const;
Valor de retorno
Um ponteiro para a estrutura CRuntimeClass
correspondente à classe deste objeto; nunca NULL
.
Comentários
Há uma estrutura CRuntimeClass
para cada classe derivada de CObject
. Os membros da estrutura são os seguintes:
LPCSTR m_lpszClassName
Uma cadeia de caracteres terminada em nulo que contém o nome da classe ASCII.int m_nObjectSize
O tamanho do objeto em bytes. Se o objeto tiver membros de dados que apontam para a memória alocada, o tamanho dessa memória não será incluído.UINT m_wSchema
O número do esquema (-1 para classes não sequenciais). Consulte a macroIMPLEMENT_SERIAL
para obter uma descrição do número do esquema.CObject* (PASCAL* m_pfnCreateObject)()
Um ponteiro de função para o construtor padrão que cria um objeto de sua classe (válido somente se a classe der suporte à criação dinâmica; caso contrário, retornaráNULL
).CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )()
Se o aplicativo estiver vinculado dinamicamente à versão AFXDLL do MFC, um ponteiro para uma função que retorna a estruturaCRuntimeClass
da classe base.CRuntimeClass* m_pBaseClass
Se o aplicativo estiver vinculado estaticamente ao MFC, um ponteiro para a estruturaCRuntimeClass
da classe base.
Essa função requer o uso da macro IMPLEMENT_DYNAMIC
, IMPLEMENT_DYNCREATE
ou IMPLEMENT_SERIAL
na implementação da classe. Caso contrário, você obterá resultados incorretos.
Exemplo
Consulte CObList::CObList
para obter uma listagem da classe CAge
usada em todos os exemplos CObject
.
CAge a(21);
CRuntimeClass* prt = a.GetRuntimeClass();
ASSERT(strcmp(prt->m_lpszClassName, "CAge") == 0);
CObject::IsKindOf
Testa a relação desse objeto com uma determinada classe.
BOOL IsKindOf(const CRuntimeClass* pClass) const;
Parâmetros
pClass
Um ponteiro para uma estrutura CRuntimeClass
associada à classe derivada de CObject
.
Valor de retorno
Diferente de zero se o objeto corresponder à classe; caso contrário, 0.
Comentários
Essa função testa pClass
para ver se (1) é um objeto da classe especificada ou (2) é um objeto de uma classe derivada da classe especificada. Essa função funciona apenas para classes declaradas com a macro DECLARE_DYNAMIC
, DECLARE_DYNCREATE
ou DECLARE_SERIAL
.
Não use essa função extensivamente porque ela anula o recurso de polimorfismo do C++. Em vez disso, use funções virtuais.
Exemplo
Consulte CObList::CObList
para obter uma listagem da classe CAge
usada em todos os exemplos CObject
.
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
Testa se esse objeto está qualificado para serialização.
BOOL IsSerializable() const;
Valor de retorno
Diferente de zero se esse objeto puder ser serializado; caso contrário, 0.
Comentários
Para que uma classe seja serializável, sua declaração deve conter a macro DECLARE_SERIAL
e a implementação deve conter a macro IMPLEMENT_SERIAL
.
Observação
Não substitua essa função.
Exemplo
Consulte CObList::CObList
para obter uma listagem da classe CAge
usada em todos os exemplos CObject
.
CAge a(21);
ASSERT(a.IsSerializable());
CObject::operator delete
Para a versão de lançamento da biblioteca, o operador delete
libera a memória alocada pelo operador 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);
Comentários
Na versão de Depuração, o operador delete
participa de um esquema de monitoramento de alocação projetado para detectar perdas de memória.
Se você usar a linha de código
#define new DEBUG_NEW
antes de qualquer uma de suas implementações em um arquivo .CPP, então a terceira versão do delete
será usado, armazenando o nome do arquivo e o número de linha no bloco alocado para relatórios posteriores. Você não precisa se preocupar em fornecer os parâmetros extras; uma macro cuidará disso para você.
Mesmo que você não use DEBUG_NEW
no modo de Depuração, você ainda receberá a detecção de perda de memória, mas sem o relatório de número de linha do arquivo de origem descrito acima.
Se você substituir os operadores new
e delete
, perderá essa funcionalidade de diagnóstico.
Exemplo
Consulte CObList::CObList
para obter uma listagem da classe CAge
usada em nos exemplos CObject
.
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
Para a versão de lançamento da biblioteca, o operador new
faz uma alocação de memória otimizada de forma semelhante a 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);
Comentários
Na versão de Depuração, o operador new
participa de um esquema de monitoramento de alocação projetado para detectar perdas de memória.
Se você usar a linha de código
#define new DEBUG_NEW
antes de qualquer uma de suas implementações em um arquivo .CPP, então a segunda versão do new
será usado, armazenando o nome do arquivo e o número de linha no bloco alocado para relatórios posteriores. Você não precisa se preocupar em fornecer os parâmetros extras; uma macro cuidará disso para você.
Mesmo que você não use DEBUG_NEW
no modo de Depuração, você ainda receberá a detecção de perda de memória, mas sem o relatório de número de linha do arquivo de origem descrito acima.
Observação
Se você substituir esse operador, também deverá substituir delete
. Não use a função _new_handler
de biblioteca padrão.
Exemplo
Consulte CObList::CObList
para obter uma listagem da classe CAge
usada em nos exemplos CObject
.
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
Lê ou grava esse objeto de ou em uma camada de arquivos.
virtual void Serialize(CArchive& ar);
Parâmetros
ar
Um objeto CArchive
do qual, ou para o qual serializar.
Comentários
Substitua Serialize
para cada classe que você pretende serializar. O substituído Serialize
deve primeiro chamar a função Serialize
de sua classe base.
Você também deve usar a macro DECLARE_SERIAL
em sua declaração de classe e deve usar a macro IMPLEMENT_SERIAL
na implementação.
Use CArchive::IsLoading
ou CArchive::IsStoring
para determinar se o arquivo está carregando ou armazenando.
Serialize
é chamado por CArchive::ReadObject
e CArchive::WriteObject
. Essas funções estão associadas ao operador de inserção CArchive
( <<
) e ao operador de extração ( >>
).
Para obter exemplos de serialização, consulte o artigo Serializar um objeto.
Exemplo
Consulte CObList::CObList
para obter uma listagem da classe CAge
usada em todos os exemplos CObject
.
void CAge::Serialize(CArchive& ar)
{
CObject::Serialize(ar);
if(ar.IsStoring())
ar << m_years;
else
ar >> m_years;
}