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() {}
}
Foi útil?

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; 
};
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top