2009-10-24 1 views
2

У меня есть класс URL, который перегружает операции ==, <, > и! = Для простого сравнения. Класс URL имеет член строковых данных и некоторые функции для работы с строкой. Операторы отлично работают при тестировании с помощью класса URL.Ошибка компилятора при использовании перегрузки вложенных операторов в C++

У меня также есть класс страницы, у которого есть член данных URL. Я пытаюсь перегрузить одни и те же операторы в классе Page. Равенство в классе страницы основано на равенстве их соответствующих URL-адресов, поэтому я использую логические операторы класса URL для сравнения страниц. Это создает некоторые ошибки компилятора, которые я не могу понять. Код для операторов URL:

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

Код для операторов Страницы:

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

Это приводит к ошибкам, так как:

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 

Я предсказываю, что это что-то тупое, что я забываю. Вы докажете мне все правильно?

Редактировать: Корректность укусила меня в заднице. Спасибо за помощь.

+0

Когда вы пишете классы C++, экземпляр являются предназначенный для использования в качестве ценностей, которые нужно манипулировать и сравнивать, 'const'-correctness очень важна. Это не только помогает избежать ошибок компилятора, но также позволяет компилятору совершать агрессивные оптимизации, например, не загружать переменные более одного раза в регистры и т. Д. – pyon

ответ

6

Это должно было быть:

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

и аналогично для других операторов.

Если вы все еще получаете ошибки компилятора, возможно, вы не сделали GetURL() Const, а также:

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

Замечательно, спасибо. Мне пришлось выполнять как функции класса GetURL(), так и класс GetURL() const. Dang мозга. – jergason

1

Я хотел бы также отметить, что методы (т.е. публичный интерфейс) существуют для защиты внешних сущностей от изменений в деталях реализации. Также, что класс автоматически является другом для себя (по той же причине) и, таким образом, просто доступ к членам другого объекта в порядке.

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

Может быть написан как:

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

На мой взгляд, это делает код более понятным (но опять-таки это мнение ваши вкусы могут различаться)

+0

Согласовано. 'GetURL()' предназначен для использования вне класса. – pyon

+0

Спасибо, что делает его чище. – jergason

+0

Я всегда шел в другую сторону: 'return GetURL() == rhs.GetURL();'. Повторное использование функции. – GManNickG

 Смежные вопросы

  • Нет связанных вопросов^_^