Перегрузка оператора C ++ внутри уже перегруженного оператора - PullRequest
1 голос
/ 17 апреля 2011

У меня проблемы с использованием перегруженных операторов в уже перегруженном операторе.В моем следующем коде я перегружен оператор && для сравнения двух объектов курса.Оператор, в свою очередь, обращается к функции, которая вызывает другие перегруженные операторы для сравнения переменных частного объекта этого объекта, чтобы в основном сравнивать их:

Код:

bool operator&&(const DaysOfWeek& a, const DaysOfWeek& b);
bool operator&&(const TimeInterval& a, const TimeInterval& b);

Теперь по моему вопросу.В этом проекте я использовал много перегруженных операторов, но мне впервые пришлось вызывать перегруженные операторы внутри других перегруженных операторов.К сожалению, мои перегруженные операторы в приведенном выше коде не вызываются из моей функции isOverlap.Поэтому мой вопрос: почему это так и как я могу это исправить?

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

Код:

bool Course::isOverlap(const Course& b) const
{
    DaysOfWeek tempDays = b.getDays();
    TimeInterval tempTime = b.getTime();
    if(this->instructor==b.getInstructor() &&
        &this->days&&(&tempDays) &&
        &this->time&&(&tempTime))
    {
        return true;
    }
    else
        return false;
}

bool operator&&(const Course& a, const Course& b)
{
    if (a.isOverlap(b))
        return true;
    else
        return false;
}

Код:

#ifndef COURSE_H
#define COURSE_H

#include <string>
#include "TimeInterval.h"
#include "DaysOfWeek.h"

using namespace std;

class Course
{
    public:
        Course();
        Course(const string courseCode, const string section,
            const DaysOfWeek& days, const TimeInterval& time,
            const string instructor);
        void setCourse(string courseCode, string section,
            DaysOfWeek& days, TimeInterval& time, string instructor);
        string getCourse() const;
        string getSection() const;
        DaysOfWeek getDays() const;
        TimeInterval getTime() const;
        string getInstructor() const;
        bool isOverlap(const Course& b) const;
        bool isMatch(const Course& b) const;

    private:
        string courseCode;
        string section;
        DaysOfWeek days;
        TimeInterval time;
        string instructor;
};

bool operator&&(const Course& a, const Course& b);
bool operator==(const Course& a, const Course& b);

#endif //COURSE_H

Я также пытался заменить код, который у меня есть:

bool Course::isOverlap(const Course& b) const
{
    DaysOfWeek tempDays = b.getDays();
    TimeInterval tempTime = b.getTime();
    if(instructor==b.getInstructor() &&
        days && tempDays &&
        time && tempTime)
    {
        return true;
    }
    else
        return false;
}

Как предложил друг, но он даже не компилируется (не соответствует аргументам перегруженного оператора &&).

Ответы [ 2 ]

3 голосов
/ 17 апреля 2011

Это:

instructor==b.getInstructor() && days && tempDays && time && tempTime

эквивалентно этому:

(((((instructor==b.getInstructor()) && days) && tempDays) && time) && tempTime)

Сначала instructor==b.getInstructor() оценивается, давая bool. Затем компилятор видит && days и пытается найти перегрузку &&, которая принимает bool и DaysOfWeek. Нет ни одного, поэтому выдает ошибку.

Чтобы использовать перегруженный && вместе со встроенным &&, вам нужно несколько скобок, чтобы принудительно сгруппировать подвыражения:

instructor==b.getInstructor() && (days && tempDays) && (time && tempTime)
                                 ^                ^    ^                ^

Тем не менее, я настоятельно советую вернуться к вашему инструктору и сказать ему, что он сумасшедший. Перегрузка оператора && (или оператора ||) почти всегда неверна, поскольку нарушает нормальную семантику оператора (при перегрузке эти два оператора перестают закорачиваться).

1 голос
/ 17 апреля 2011
   DaysOfWeek tempDays = b.getDays();
    TimeInterval tempTime = b.getTime();
    if(this->instructor==b.getInstructor() &&
        &this->days&&(&tempDays) &&
        &this->time&&(&tempTime))

Выше вы используете логический и для адреса days по сравнению с адресом tempDays, вы должны сравнивать объекты, а не адреса.То же самое с time и tempTime.

...