Como encaminhar a chamada do construtor sobrecarregado para outro construtor em C ++/CLI
-
23-09-2019 - |
Pergunta
Eu sei que não há como fazer isso em C ++ puro, mas eu queria saber se é possível chamar um construtor da lista de inicialização de outro construtor na C ++/CLI, da mesma forma que se pode fazê -lo em C#.
Exemplo:
ref class Foo {
Foo() {}
Foo(int i) : Foo() {}
}
Solução
É chamado de "construtor delegado". Ainda não está disponível no idioma. Mas há uma proposta formal, você a encontrará no anexo F.3.1 do Especificação de idioma. Dada a posição da Microsoft em relação ao C ++/CLI, é improvável que veja a luz do dia em breve.
ATUALIZAÇÃO: Os construtores delegadores tinham uma vida além da proposta nesse anexo, eles foram adicionados à especificação padrão do idioma C ++ 11. A Microsoft tem trabalhado para implementar as adições C ++ 11. Os construtores delegadores finalmente chegaram ao VS2013. E eles também trabalham no C ++/CLI nessa edição.
Outras dicas
Você pode fazer seguinte
ref class A
{
public:
A(int p) : p(p) { this->A::A(); }
A() : p(1) {}
int p;
};
Não é um código C ++ válido, mas o VC compila bem :)
Acabei de tropeçar, pela mesma pergunta. No meu caso, estou usando o VS2010.
É claro que o VS2010 nunca será atualizado para implementar totalmente o C ++ 11, use o VS2015 se precisar de melhor conformidade com o padrão (o que eu faço quando puder). Mas para alguns projetos (legados), ainda tenho que usar o VS2010.
Uma abordagem que funciona em muitos casos (para mim) é o uso de uma função privada com todo o código de inicialização compartilhado. Exemplo:
class A
{
private:
void Inidialise() { /* common initialisation here */ }
public:
A() { Initialise(); /* specific initialisation for A() here */ }
A(bool a) { Initialise(); /* specific initialisation for A(bool) here */ }
A(int b) { Initialise(); /* specific initialisation for A(int) here */ }
/* etcetera */
}
Ele não resolve todos os 'problemas' e não impede todos os casos de código duplicado, mas percorre um longo caminho.
Quando você disse "Eu sei que não há como fazer isso no puro C ++" você estava com erro. É possível fazer isso no C ++ nativo. Você pode usar o novo operador de colocação para fazê -lo.
class A
{
public:
A(int p) : p(p)
{ new(this)A(); }
A() : p(1) {}
int p;
};