não-const privada e função membro const pública - coexistindo em paz?
-
05-07-2019 - |
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() */
}
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;