已经重载的运算符中的C ++运算符重载

时间:2011-04-17 03:23:22

标签: c++ operator-overloading overloading operator-keyword

我在已经重载的运算符中使用重载运算符时遇到了一些问题。在我的下面的代码中,我已经超载了&&运算符来比较两个Course对象。操作符又转到一个函数,该函数调用其他重载操作符来比较该对象的私有对象变量,以便主要比较它们:

代码:

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;
}

正如朋友所建议的那样,但这甚至没有编译(与重载&amp;&amp;运算符的参数不匹配)。

2 个答案:

答案 0 :(得分:3)

此:

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

相当于:

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

首先评估instructor==b.getInstructor(),产生bool。然后,编译器会看到&& days并尝试查找&&的重载,该重载需要boolDaysOfWeek。没有一个,所以它会产生错误。

要在内置&&旁边使用重载的&&,您需要使用一些括号来强制对子表达式进行分组:

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

那就是说,我强烈建议回到你的导师那里告诉他他疯了。重载&&运算符(或||运算符)几乎总是错误的,因为它打破了运算符的正常语义(当重载时,这两个运算符停止短路)。

答案 1 :(得分:1)

   DaysOfWeek tempDays = b.getDays();
    TimeInterval tempTime = b.getTime();
    if(this->instructor==b.getInstructor() &&
        &this->days&&(&tempDays) &&
        &this->time&&(&tempTime))

在上面你使用逻辑和days的地址与tempDays的地址相比,你应该比较对象,而不是地址。与timetempTime相同。