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
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:
-
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.
-
O construtor e o construct () são encapsulados usando private, portanto você não pode definir objetos por classe.
-
Defina a função de membro estática NewInstance () na classe como a função de criação de objeto. static TwoPhaseCons * NewInstance ();
-
Use new para criar um objeto na função de objeto, TwoPhaseCons * ret = new TwoPhaseCons ();
-
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; }