我在已经重载的运算符中使用重载运算符时遇到了一些问题。在我的下面的代码中,我已经超载了&&运算符来比较两个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;运算符的参数不匹配)。
答案 0 :(得分:3)
此:
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 :(得分:1)
DaysOfWeek tempDays = b.getDays();
TimeInterval tempTime = b.getTime();
if(this->instructor==b.getInstructor() &&
&this->days&&(&tempDays) &&
&this->time&&(&tempTime))
在上面你使用逻辑和days
的地址与tempDays
的地址相比,你应该比较对象,而不是地址。与time
和tempTime
相同。