operador de atribuição padrão na classe interna com membros de referência
-
11-09-2019 - |
Pergunta
eu correr em um problema que eu não entendo e eu estava esperando que alguém aqui pode fornecer algum insight. O código simplificado é a seguinte (código original era um costume fila / fila-iterator implementação):
class B
{
public:
B() {};
class C
{
public:
int get();
C(B&b) : b(b){};
private:
B& b;
};
public:
C get_c() { return C(*this); }
};
int main()
{
B b;
B::C c = b.get_c();
c = b.get_c();
return EXIT_SUCCESS;
}
Este, quando compilado, me dá o seguinte erro:
foo.cpp: In member function 'B::C& B::C::operator=(const B::C&)':
foo.cpp:46: error: non-static reference member 'B& B::C::b', can't use default assignment operator
foo.cpp: In function 'int main()':
foo.cpp:63: note: synthesized method 'B::C& B::C::operator=(const B::C&)' first required here
Eu posso ir ao redor isso usando duas variáveis ??C separados, como é suposto ser independente objetos 'C', mas isso só esconde o problema (eu ainda não entendo por que eu não posso fazer isso).
Eu acho que a razão é que a referência não pode ser copiado, mas eu não entendo o porquê. Eu preciso fornecer meu próprio operador de atribuição eo construtor de cópia?
Solução
Este problema não tem nada a ver com classes internas. Em C ++ você simplesmente não pode (re) referências atribuir - eles precisam ser inicializado quando definido
.Um exemplo simples é:
class B
{
public:
B(int& i) : ir(i) {};
int& ir;
};
int main()
{
int i;
B b(i); // Constructor - OK
int j;
B bb = B(j); // Copy constructor - OK
bb = b; // Assignment - Error
return 0;
}
Outras dicas
Uma referência não pode ser alterado depois de ter sido dado o seu valor inicial. Isto significa que é impossível escrever um operador de atribuição que altera o valor de um membro de referência. Se você precisar fazer isso, use um ponteiro em vez de uma referência.
Na verdade, há uma solução para isso. Você pode implementar operador = em termos de cópia construção , e vai funcionar :) é uma técnica muito capaz para tais casos. Supondo que você quer atribuição de apoio.
C ++ não tem "classes internas", apenas declarações de classes aninhadas. "Classes internas" são um Java-ismo que eu não acho que são encontrados em outras linguagens tradicionais. Em Java, classes internas são especiais porque eles contêm uma referência implícita imutável a um objecto do tipo que contém. Para alcançar o equivalente a declarações aninhados 's C ++ em Java requer o uso de classes internas estáticas; classes internas estáticas não contêm uma referência a um objeto do tipo declarativo.