Caso 1: Main.cpp
class Complex
{
void func()
{
Complex c1; // Creating same class object allowed inside a function. Code builds fine. Why?
}
};
int main()
{
return 0;
}
Caso 2: Main.cpp
class Complex
{
Complex c1; // Creating same class object not allowed as data member. Build fails because class incomplete
};
int main()
{
return 0;
}
Eu sei por que o caso 2 não é construído. Mas por que o caso 1 está passando? Eu li que o compilador está em conformidade com o código de cima para baixo, linha por linha. O caso 1 também não deveria falhar pelo mesmo motivo?
(2) falha porque a classe ainda não foi concluída naquele ponto (a lista completa de variáveis de membro ainda não é conhecida, mais ou menos). E também por questão de bom senso, pois causaria um aninhamento infinito de objetos (e memória infinita se você adicionar qualquer outra variável membro).
(1) Passa porque o compilador realiza duas passagens em uma classe para analisá-la. Os corpos dos métodos são processados durante a segunda passagem, momento em que a classe já está concluída. Além disso (1) não requer memória infinita, a chamada
.func()
apenas cria mais um objeto.O caso dois falha porque um objeto precisa ter um tamanho finito na memória. Não há razão para que uma função membro de uma classe não possa ter um objeto local do mesmo tipo. Se o objeto tiver um tamanho finito (não absurdo), não há razão para que ele não possa ser criado na pilha quando a função membro for chamada.
Esse objeto só é criado quando
Complex::func
é chamado.