Pergunta

Eu estou tentando criar uma classe com dois métodos com o mesmo nome, usado para acessar um membro privado. Um método é público e const qualificado, o outro é privado e não-const (usado por uma classe amigo para modificar o membro por meio de retorno por referência).

Infelizmente, eu estou recebendo compilar erros (usando g ++ 4.3): Ao usar um objeto não-const para chamar o método, g ++ reclama que a versão não-const do meu método é privado, embora uma versão pública (const) existe.

Isso parece estranho, porque se a versão privado não-const não existe, tudo compila bem.

Existe alguma maneira de fazer este trabalho? Será que compilar em outros compiladores?

Graças.

Exemplo:

class A
{
public:
    A( int a = 0 ) : a_(a) {}
public:
    int   a() const { return a_; }
private:
    int & a()       { return a_; } /* Comment this out, everything works fine */
    friend class B;
private:
    int a_;
};


int main()
{
    A       a1;
    A const a2;

    cout << a1.a() << endl; /* not fine: tries to use the non-const (private) version of a() and fails  */
    cout << a2.a() << endl; /* fine: uses the const version of a() */
}
Foi útil?

Solução

Resolução de sobrecarga acontece antes que o acesso a verificação, por isso, quando você chamar o método em um A não-const, o membro não-const é escolhido como um jogo melhor. O compilador, em seguida, falhar devido à verificação de acesso.

Não há nenhuma maneira de "fazer este trabalho", a minha recomendação seria a de mudar o nome da função privada. Existe alguma necessidade de ter um acessador particular?

Outras dicas

Ele só irá selecionar a versão const se o objeto é declarado é const, caso contrário ele irá selecionar a versão não-const (mesmo que resulta em um erro).

Isso deve funcionar:

cout << ((const A*)&a1)->a() << endl;

ou este:

A const& ra1 = a1;
cout << ra1.a() << endl;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top