Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Определенный оператор сравнения


Автор: IValdemar 20.3.2012, 22:14
Собственно вот в чем проблема:
у меня в программе есть такая строчка
Код

POINT_R2 delta,LastDirection;
//..Тут строчек 200 кода
if (delta==LastDirection) //...Вот тут выкидывает ошибку

В ошибке говорится, что он не может понять какой оператор == использовать
candidates are: bool POINT_R2::operator==(POINT_R2&)
BOOL operator==(const GUID&, const GUID&)

Подскажите как можно объяснить компилятору что надо использовать первый вариант smile 

класс POINT_R2 описан в отдельном header'e там оператор сравнения определен таким образом
Код

bool operator==(POINT_R2& second)
    {
        return this->x==second.x&&this->y==second.y;
    }


Я так понимаю тут что-то с namespace надо намудрить, так как если я делаю в header'e такую функцию
Код

bool cmp(POINT_R2 first, POINT_R2 second)
{
    return first==second;
}

и сравниваю ей, то все работает.

Автор: mes 20.3.2012, 22:23
IValdemar,  покажите все описание POINT_R2

Автор: IValdemar 20.3.2012, 22:41
Вот полное описание  smile 
Код

class POINT_R2
{
    public:
    POINT_R2(int X=0,int Y=0):x(X),y(Y){};
    POINT_R2(COORD P):x(P.X),y(P.Y){}
    ~POINT_R2(){};
    friend COORD C_(POINT_R2 P);
    POINT_R2& operator=(POINT_R2 Other)
    {
        this->x=Other.x;
        this->y=Other.y;
        return *this;
    }
    POINT_R2& operator=(COORD Other)
    {
        this->x=Other.X;
        this->y=Other.Y;
        return *this;
    }
    bool operator==(POINT_R2& second)
    {
        return this->x==second.x&&this->y==second.y;
    }
    bool operator!=(POINT_R2& second)
    {
        return !((*this)==second);
    }
    int x,y;
};

Автор: volatile 20.3.2012, 23:17
Цитата(IValdemar @  20.3.2012,  22:41 Найти цитируемый пост)
  bool operator==(POINT_R2& second)
    {
        return this->x==second.x&&this->y==second.y;
    }

добавьте здесь конст. Полюбому он здесь нужен, скорей всего и проблема решится
Код

bool operator==(const POINT_R2& second) const
{
    return this->x==second.x&&this->y==second.y;
}

Автор: IValdemar 20.3.2012, 23:27
volatile
Большое спасибо, проблема исчезла.  smile 
Но мне все таки не понятно, почему const решил все проблемы? В общем можно это по подробнее освятить, дабы я понял зачем он там добавляется. 
Я знаю что const добавляют там где элемент не должен меняться, это является хорошим тоном, то есть по идее тут он как раз к месту, но почему без него вылетает ошибка? Это ведь не более чем хороший тон программирования.

Автор: volatile 21.3.2012, 00:01
Цитата(IValdemar @  20.3.2012,  23:27 Найти цитируемый пост)
почему без него вылетает ошибка? Это ведь не более чем хороший тон программирования.

В принципе в вашем коде, верней в том виде как вы его привели, ошибки быть не должно.
Телепатически я просто подумал, что где-то константность появляется.
может быть где-то здесь:
Цитата(IValdemar @  20.3.2012,  22:14 Найти цитируемый пост)
//..Тут строчек 200 кода


Чисто асбстрактно, если все писать плохим стилем, (и не использовать библиотеки написанные хорошим стилем), то без константности можно обойтись. 
Хотя этого делать категорически не рекомендуется!
Мой вам совет ставьте константость, везде где объект не меняется, не пожалеете.
Кстати, в вашем коде это не единственное место, где не помешало бы добавить константность.

Автор: mes 21.3.2012, 00:08
Цитата(IValdemar @  20.3.2012,  22:27 Найти цитируемый пост)
 но почему без него вылетает ошибка

Вы уверены что привели ошибочную строчку верно ? может там сравнивается возвращаемое из функции ?

Добавлено через 4 минуты и 49 секунд
полагаю Ваша ошибка неподолеку от этого примера :
http://liveworkspace.org/code/3e95956bea39ec7149273c3bb0fdff6c

Добавлено через 6 минут и 17 секунд
и в след. раз желательно сообщение об ошибке и саму строчку передавать точно, а не своими словами.. 
а еще лучше сделать минимальный пример , демонстрирующий ошибку... 

Автор: IValdemar 21.3.2012, 15:11
Такс, хотел сделать чистый пример и показать вам ошибку. НО! Как я ни изощрялся не получилось у меня сделать там ошибку smile Даже без const все работает, так что видимо действительно
Цитата(volatile @  21.3.2012,  00:01 Найти цитируемый пост)

может быть где-то здесь:

Цитата(IValdemar @  20.3.2012,  22:14 Найти цитируемый пост)
//..Тут строчек 200 кода



Что-то я там напортачил smile 
Всем спасибо за участие и помощь. Тему закрываю.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)