Pergunta

Eu tenho uma classe URL que sobrecargas o ==, <,> e! = Operadores de comparação simples. A classe URL tem um membro de dados de cadeia e algumas funções para atuar na corda. Os operadores funcionam bem quando testado com a classe URL.

Eu também tenho uma classe de página que tem um membro de dados URL. Eu estou tentando sobrecarregar os mesmos operadores na classe de página. Igualdade na classe de página é baseada na igualdade de suas respectivas URLs, então eu uso os operadores booleanos classe URL na comparação páginas. Isso cria alguns erros do compilador que eu não consigo descobrir. Código para os operadores URL:

bool URL::operator ==(URL & u) const {
    //url is the string instance variable
    return url == u.GetURL();
}

código para operadores página:

bool Page::operator ==(Page & p) const {
    //url is the URL instance variable of the Page class
    return url == p.GetURL();
}

Isto produz erros assim:

src/Page.cpp: In member function ‘bool Page::operator==(Page&) const’:
src/Page.cpp:21: error: no match for ‘operator==’ in ‘((const Page*)this)->Page::url == Page::GetURL()()’
inc/URL.h:118: note: candidates are: bool URL::operator==(URL&) const

Eu prevejo que é algo estúpido que eu estou esquecendo. Você vai me provar certo?

Editar: Const exatidão me mordeu no traseiro. Obrigado pela ajuda.

Foi útil?

Solução

Deve ter sido:

bool URL::operator ==(const URL & u) const {
    //url is the string instance variable
    return url == u.GetURL();
}

E analogamente para os outros operadores.

Se você ainda receber erros do compilador, talvez você não tenha feito const GetURL() assim:

std:string URL::GetURL() const {
    // whatever...
}

Outras dicas

Gostaria também de salientar que os métodos (ou seja, a interface pública) estão lá para proteger entidades externas de alterações nos detalhes de implementação. Também que uma classe é automaticamente um amigo de si mesmo (pelo mesmo motivo) e, portanto, apenas acessar os membros do outro objeto é OK.

bool URL::operator ==(URL & u) const {
    //url is the string instance variable
    return url == u.GetURL();
}

Pode ser escrito como:

bool URL::operator ==(URL & rhs) const
{
    return url == rhs.url;  // No need to use GetURL()
}

Em minha mente o que torna o código mais claro (mas isso é outra vez uma opinião seus gostos podem variar)

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