Partilhar via


CObject Classe

Observação

A biblioteca Microsoft Foundation Classes (MFC) continua a ser suportada. No entanto, já não estamos a adicionar funcionalidades nem a atualizar a documentação.

A principal classe base para a Microsoft Foundation Class Library.

Sintaxe

class AFX_NOVTABLE CObject

Membros

Construtores Protegidos

Nome Description
CObject::CObject Construtor padrão.

Métodos Públicos

Nome Description
CObject::AssertValid Valida a integridade deste objeto.
CObject::Dump Produz um dump diagnóstico deste objeto.
CObject::GetRuntimeClass Devolve a CRuntimeClass estrutura correspondente à classe deste objeto.
CObject::IsKindOf Testa a relação deste objeto com uma determinada classe.
CObject::IsSerializable Testes para ver se este objeto pode ser serializado.
CObject::Serialize Carrega ou armazena um objeto de/para um arquivo.

Operadores Públicos

Nome Description
CObject::operator delete Operador especial delete .
CObject::operator new Operador especial new .

Observações

Serve de raiz não só para classes de biblioteca como CFile e CObList, mas também para as classes que escreves. CObject fornece serviços básicos, incluindo

  • Suporte para serialização
  • Informação da classe em tempo de execução
  • Saída de diagnóstico de objetos
  • Compatibilidade com classes de coleção

CObject Não suporta múltiplas heranças. As tuas classes derivadas podem ter apenas uma CObject classe base, e essa CObject deve ser a mais à esquerda na hierarquia. É permitido, no entanto, ter estruturas e classes não CObjectderivadas em ramos de múltipla herança à direita.

Vais perceber grandes benefícios com CObject a derivação se usares algumas das macros opcionais na implementação e declarações da tua 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. Isto, por sua vez, permite um despejo diagnóstico significativo.

Os macros de segundo nível, DECLARE_SERIAL e IMPLEMENT_SERIAL, incluem toda a funcionalidade dos macros de primeiro nível, e permitem que um objeto seja "serializado" para e a partir de um "arquivo".

Para informações sobre a derivação de classes Microsoft Foundation e classes C++ em geral e sobre o uso CObjectde , veja Uso de CObject e Serialização.

Hierarquia de herança

CObject

Requerimentos

Cabeçalho:afx.h

CObject::AssertValid

Valida a integridade deste objeto.

virtual void AssertValid() const;

Observações

AssertValid Realiza uma verificação de validade sobre este objeto verificando o seu estado interno. Na versão Debug da biblioteca, AssertValid pode afirmar e depois terminar o programa com uma mensagem que lista o número da linha e o nome do ficheiro onde a asserção falhou.

Quando escreves a tua própria classe, deves sobrepor a AssertValid função para fornecer serviços de diagnóstico para ti e para outros utilizadores da tua classe. A sobreposição AssertValid normalmente chama a AssertValid função da sua classe base antes de verificar os membros de dados únicos da classe derivada.

Como AssertValid é uma const função, não é permitido mudar o estado do objeto durante o teste. As suas próprias funções de classe AssertValid derivadas não devem lançar exceções, mas sim afirmar se detetam dados de objetos inválidos.

A definição de "validade" depende da classe do objeto. Regra geral, a função deve fazer um "teste superficial". Ou seja, se um objeto contém ponteiros para outros objetos, deve verificar se os ponteiros não NULLsão , mas não deve fazer testes de validade nos objetos referidos pelos ponteiros.

Example

Veja CObList::CObList uma lista das CAge classes usadas em todos CObject os exemplos.

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

Para outro exemplo, veja AfxDoForAllObjects.

CObject::CObject

Estas funções são os construtores padrão CObject .

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

Parâmetros

objectSrc
Uma referência a outro CObject

Observações

A versão padrão é automaticamente chamada pelo construtor da sua classe derivada.

Se a sua classe for serializável (incorpora o IMPLEMENT_SERIAL macro), então deve ter um construtor padrão (um construtor sem argumentos) na sua declaração de classe. Se não precisares de um construtor padrão, declara um construtor privado ou protegido "vazio". Para mais informações, consulte Utilização CObjectde .

O construtor padrão C++ de copy class copy faz uma cópia membro a membro. A presença do construtor de cópias privadas CObject 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ópias se a sua classe exigir esta capacidade.

Example

Veja CObList::CObList uma lista das CAge classes usadas nos CObject exemplos.

// 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 teu objeto para um CDumpContext objeto.

virtual void Dump(CDumpContext& dc) const;

Parâmetros

dc
O contexto de dump de diagnóstico para dumping, normalmente afxDump.

Observações

Quando escreves a tua própria classe, deves sobrepor a Dump função para fornecer serviços de diagnóstico para ti e para outros utilizadores da tua classe. O sobreposto Dump normalmente chama a Dump função da sua classe base antes de imprimir os membros de dados únicos da classe derivada. CObject::Dump Imprime o nome da turma se a tua turma usar a IMPLEMENT_DYNAMIC macro OR IMPLEMENT_SERIAL .

Observação

A tua Dump função não deve imprimir um carácter de nova linha no final da sua saída.

Dump as chamadas só fazem sentido na versão Debug da Microsoft Foundation Class Library. Deves colocar entre chaves chamadas, declarações de função e implementações de funções com #ifdef _DEBUGinstruções , #endif para compilação condicional.

Como Dump é uma const função, não é permitido alterar o estado do objeto durante o dump.

O CDumpContext operador de inserção (<<) chama Dump quando um CObject ponteiro é inserido.

Dump permite apenas despejo "acíclico" de objetos. Pode, por exemplo, despejar uma lista de objetos, mas se um dos objetos for a própria lista, acabará por saturar a pilha.

Example

Veja CObList::CObList uma lista das CAge classes usadas em todos CObject os exemplos.

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

CObject::GetRuntimeClass

Devolve a CRuntimeClass estrutura correspondente à classe deste objeto.

virtual CRuntimeClass* GetRuntimeClass() const;

Valor de retorno

Um apontador para a CRuntimeClass estrutura correspondente à classe deste objeto; nunca NULL.

Observações

Existe uma CRuntimeClass estrutura para cada CObjectclasse derivada em . Os membros estruturais são os seguintes:

  • LPCSTR m_lpszClassName Uma cadeia terminada por nulo contendo 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 é incluído.

  • UINT m_wSchema O número do esquema (-1 para classes não serializáveis). Veja a IMPLEMENT_SERIAL macro para 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 da sua classe (válido apenas se a classe suportar a criação dinâmica; caso contrário, devolve NULL).

  • CRuntimeClass* (PASCAL* m_pfn_GetBaseClass )() Se a sua aplicação estiver dinamicamente ligada à versão AFXDLL do MFC, um apontador para uma função que devolve a CRuntimeClass estrutura da classe base.

  • CRuntimeClass* m_pBaseClass Se a sua aplicação estiver ligada estaticamente ao MFC, um apontador para a CRuntimeClass estrutura da classe base.

Esta função requer o uso do IMPLEMENT_DYNAMIC, IMPLEMENT_DYNCREATE, ou IMPLEMENT_SERIAL macro na implementação da classe. Caso contrário, vais obter resultados incorretos.

Example

Veja CObList::CObList uma lista das CAge classes usadas em todos CObject os exemplos.

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

CObject::IsKindOf

Testa a relação deste objeto com uma determinada classe.

BOOL IsKindOf(const CRuntimeClass* pClass) const;

Parâmetros

pClass
Um apontador para uma CRuntimeClass estrutura associada à sua CObjectclasse derivada em .

Valor de retorno

Não nulo se o objeto corresponder à classe; caso contrário, 0.

Observações

Esta função testa pClass se (1) é um objeto da classe especificada ou (2) é um objeto de uma classe derivada da classe especificada. Esta função funciona apenas para classes declaradas com o DECLARE_DYNAMIC, DECLARE_DYNCREATE, ou DECLARE_SERIAL macro.

Não uses esta função extensivamente porque ela anula a funcionalidade de polimorfismo C++. Use funções virtuais em vez disso.

Example

Veja CObList::CObList uma lista das CAge classes usadas em todos CObject os exemplos.

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 este objeto é elegível para serialização.

BOOL IsSerializable() const;

Valor de retorno

Não nulo se este objeto puder ser serializado; caso contrário, 0.

Observações

Para que uma classe seja serializável, a sua declaração deve conter a DECLARE_SERIAL macro, e a implementação deve conter a IMPLEMENT_SERIAL macro.

Observação

Não sobrepiques esta função.

Example

Veja CObList::CObList uma lista das CAge classes usadas em todos CObject os exemplos.

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

CObject::operator delete

Para a versão Release da biblioteca, o operador delete liberta 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);

Observações

Na versão Debug, o operador delete participa num esquema de monitorização de alocação concebido para detetar fugas de memória.

Se usares a linha de código

#define new DEBUG_NEW

antes de qualquer uma das tuas implementações num . CPP, depois será usada a terceira versão delete , armazenando o nome do ficheiro e o número de linha no bloco alocado para relatórios posteriores. Não tens de te preocupar em fornecer os parâmetros extra; Um macro trata disso por ti.

Mesmo que não uses DEBUG_NEW em modo Debug, ainda obténs deteção de fugas, mas sem o relatório do número de linha do ficheiro de origem descrito acima.

Se sobrepor operadores new e delete, perde esta capacidade de diagnóstico.

Example

Veja CObList::CObList uma lista das CAge classes usadas nos CObject exemplos.

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 Release da biblioteca, o operador new faz uma alocação ótima de memória 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);

Observações

Na versão Debug, o operador new participa num esquema de monitorização de alocação concebido para detetar fugas de memória.

Se usares a linha de código

#define new DEBUG_NEW

antes de qualquer uma das tuas implementações num . CPP, depois será usada a segunda versão new , armazenando o nome do ficheiro e o número de linha no bloco alocado para relatórios posteriores. Não tens de te preocupar em fornecer os parâmetros extra; Um macro trata disso por ti.

Mesmo que não uses DEBUG_NEW em modo Debug, ainda obténs deteção de fugas, mas sem o relatório do número de linha do ficheiro de origem descrito acima.

Observação

Se sobrepor este operador, também deve sobrepor delete. Não uses a função padrão da biblioteca _new_handler .

Example

Veja CObList::CObList uma lista das CAge classes usadas nos CObject exemplos.

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 escreve este objeto a partir de ou para um arquivo.

virtual void Serialize(CArchive& ar);

Parâmetros

ar
Um CArchive objeto para serializar para ou a partir de.

Observações

Substitui Serialize para cada classe que pretendes serializar. O sobreposto Serialize deve primeiro chamar a Serialize função da sua classe base.

Também deve usar a DECLARE_SERIAL macro na sua declaração de classe e deve usar a IMPLEMENT_SERIAL macro na implementação.

CArchive::IsLoading Use ou CArchive::IsStoring para determinar se o arquivo está a carregar ou a armazenar.

Serialize é chamado por CArchive::ReadObject e CArchive::WriteObject. Estas funções estão associadas ao CArchive operador de inserção ( <<) e ao operador de extração ( >>).

Para exemplos de serialização, veja o artigo Serializar um Objeto.

Example

Veja CObList::CObList uma lista das CAge classes usadas em todos CObject os exemplos.

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

Consulte também

Gráfico de Hierarquia