Share via


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çalhoafx.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 Devolução

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 macro IMPLEMENT_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 estrutura CRuntimeClass da classe base.

  • CRuntimeClass* m_pBaseClass Se o aplicativo estiver vinculado estaticamente ao MFC, um ponteiro para a estrutura CRuntimeClass 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 Devolução

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 Devolução

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;
}

Confira também

Gráfico da hierarquia