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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top