Notas de estudo em C ++ (5): modo de construção de segunda ordem

0x01 Por que precisamos usar o modo de construção de segunda ordem

  • Não é possível julgar o resultado da execução do construtor ao criar o objeto
  • Tome a declaração de retorno no construtor como exemplo, esse resultado é que o objeto nascerá, mas pode haver problemas com a inicialização
  • O final da execução do construtor não significa que o objeto foi construído com êxito, porque a inicialização do objeto pode não ser a esperada, como aplicativos de memória durante o processo de inicialização, acesso a arquivos e outras operações

Se a operação de inicialização não puder ser concluída conforme o esperado, o objeto obtido será chamado de objeto semiacabado.O objeto semiacabado é um objeto legal em C ++ e uma fonte importante de erros.

0x02 Quando usar a construção de segunda ordem

Existem operações que requerem o uso de recursos do sistema (podem ocorrer exceções):

  • Aplicação de memória
  • Arquivo de acesso

0x03 Como usar a construção de segunda ordem

1587371895422

Exemplo de código:

#include <stdio.h>

class TwoPhaseCons 
{
private:
    TwoPhaseCons() // 第一阶段构造函数
    {   
    }
    bool construct() // 第二阶段构造函数
    { 
        return true; 
    }
public:
    static TwoPhaseCons* NewInstance(); // 对象创建函数
};

TwoPhaseCons* TwoPhaseCons::NewInstance() 
{
    TwoPhaseCons* ret = new TwoPhaseCons();

    // 若第二阶段构造失败,返回 NULL    
    if( !(ret && ret->construct()) ) 
    {
        delete ret;
        ret = NULL;
    }
        
    return ret;
}


int main()
{
    TwoPhaseCons* obj = TwoPhaseCons::NewInstance();
    
    printf("obj = %p\n", obj);

    delete obj;
    
    return 0;
}

Uso do modo de construção de segunda ordem:

  1. O conteúdo que precisa ser inicializado é dividido em dois estágios: operação inicial independente de recurso e operação de aplicativo de recurso do sistema.

  2. O construtor e o construct () são encapsulados usando private, portanto você não pode definir objetos por classe.

  3. Defina a função de membro estática NewInstance () na classe como a função de criação de objeto. static TwoPhaseCons * NewInstance ();

  4. Use new para criar um objeto na função de objeto, TwoPhaseCons * ret = new TwoPhaseCons ();

  5. Na função de criação de objeto, julgue se o novo objeto foi criado com sucesso e se a construção em dois estágios foi bem-sucedida.

    TwoPhaseCons* TwoPhaseCons::NewInstance() 
    {
        TwoPhaseCons* ret = new TwoPhaseCons();
    
        // 若第二阶段构造失败,返回 NULL    
        if( !(ret && ret->construct()) ) 
        {
            delete ret;
            ret = NULL;
        }
            
        return ret;
    }
    

Acho que você gosta

Origin www.cnblogs.com/askta0/p/12738956.html
Recomendado
Clasificación