运算符重载“+”& “=”问题 - 学校助理

时间:2014-09-14 04:48:58

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

第一次在这里发布海报,但潜伏了几个月了。目前沉浸在C ++中,只需要掌握少量的Java知识以及学校以前的Comp Sci课程。如果你们中的一些人看到这个而感到失望,我很抱歉,因为已经有关于操作员超载的问题,但我无法将我的程序与我能够在这里找到的程序完全错误放在一起。

这个问题尤其与+& =运营商。我已经在课堂上完成了几个涉及这两个重载的程序,我似乎没有任何困难使程序正常运行;但是,必须与这些先前的程序存在一些明显的差异,而我目前的程序与我未能看到的不同,这超出了我对每个运算符重载如何工作的理解。

错误消息本身使问题看起来几乎太容易修复,因为它只是一个操作数匹配问题,但我仍然无法找到正确的语法来纠正这些错误。它们如下:

"1>...\grademain.cpp(19): error C2679: binary '=' : no operator found which takes a right-hand 1>operand of type 'const char [12]' (or there is no acceptable conversion)
1>...\grade.h(39): could be 'Grade &Grade::operator =(const Grade &)'
1>          while trying to match the argument list '(Grade, const char [12])'  "

"1>...\grademain.cpp(26): error C2679: binary '+' : no operator found which takes a right-hand 1>operand of type 'int' (or there is no acceptable conversion)
1>...\grade.h(40): could be 'Grade Grade::operator +(const Grade &)'
1>\grade.h(16): or       'int operator +(const Grade &)'
1>          while trying to match the argument list '(Grade, int)'  "

代码如下:

GradeMain.cpp:

#include <iostream>
#include <string>
#include "Grade.h"

using namespace std;

int main(void)
{
    Grade student1("Tom Smith", 90);        //declare initialized object
    cout << "First: " << student1 << endl;

    Grade student2;
    student2 = "Bill Miller";   //uses conversion constructor           //  ERROR # 1
    cout << "Second: " << student2 << endl;

    Grade student3;
    student3 = student1;
    cout << "Third: " << student3 << endl;

    int adjusted_grade = student1 + 4;                                  //  ERROR # 2
    cout << "adjusted grade of first by 4 points gives " << adjusted_grade << endl;

    //test equality operator
    if (student1 == student2)
        cout << "\nerror - students should not be equal\n";
    else
        cout << "\nstudent 1 is not equal to student 2\n";

    if (student1 == student3)
        cout << "\nstudent 1 is equal to student 3\n";
    else
        cout << "\nerror - student 1 should be equal to student 3\n";

    system("pause");
    return 0;
}

Grade.cpp:

#include <iostream>
#include <string>
#include "Grade.h"


//  Copy Assignment
Grade &Grade::operator=(const Grade &temp)
{
    name = temp.name;
    grade = temp.grade;

    return *this;
}

//  Addition Operator Overload
Grade Grade::operator+(const Grade &temp)
{
    Grade temp1;

    temp1.grade = grade + temp.grade;       

    return *this;
}

//  Output Operator Overload
ostream& operator<<(ostream &os, const Grade &p)
{
    os << p.name << " " << p.grade;

    return os;
}

//  Input Operator Overload
istream& operator>>(istream &in, const Grade &p)
{
    //  No purpose for program -- User does not input anything
    return in;
}

//  Comparison Operator Overload
bool Grade::operator==(const Grade &temp)
{
    if(grade == temp.grade)
        return true;
    else
        return false;
}

Grade.h:

using namespace std;

class Grade
{
    //  Friend Function Prototypes
    friend ostream& operator<<(ostream& , const Grade&);
    friend istream& operator>>(istream& , const Grade&);        //  Not necessary -- deleting  
    friend bool operator==(const Grade&, const Grade&);     
    friend int operator+(const Grade&);
private:
    string name;
    int grade;
public:
    //  Default Constructor
    Grade();

    //  Constructor
    Grade(string studentName, int studentGrade)
    {
        name = studentName;
        grade = studentGrade;
    }

    //  Copy Constructor
    Grade(const Grade &obj)
    {
        name = obj.name;
        grade = obj.grade;
    }

    //  Operator Overloads
    Grade& operator=(const Grade &);        //  Copy Assignment
    Grade operator+(const Grade &);
    Grade& operator<<(const Grade &);
    Grade& operator>>(const Grade &);
    bool operator==(const Grade &); 
};

我对operator =问题的一些困惑是,当我将student3分配给student1时,没有问题,但是当我只是分配student2 =“Bill Miller”时,它会遇到操作数问题。我原以为这只会创造student2(“Bill Miller”,0)的对象,但我在某处肯定是错的。我只能想象,无论如何纠正,这也将纠正操作数问题,在根据当前指定的等级分配新变量时更新student1的等级。有些东西告诉我它可能只是当前函数的结构,操作符+重载可能需要类似于“int Grade :: operator +(const Grade&amp;)”而不是“Grade Grade:operator +( const Grade&amp;)“,但到目前为止我所有努力找到合适的语法都是徒劳的。

你可以指点我的任何方向,以便更好地了解如何摆脱我所处的情况绝对优秀,只是不要直接给我答案(当然)!因为这是一个课程作业,所以任何建议都应该只适用于Grade.cpp和Grade.h,因为GradeMain是由教师提供的。

非常感谢您阅读:)

1 个答案:

答案 0 :(得分:2)

当你说

student2 = "Bill Miller";

这将涉及两个用户定义的转换:一个从const char *std::string,另一个从std::stringGrade。但是,C ++只允许进行一次自动用户定义转换。

此外,你有一个带std::string的构造函数,但它也需要一个额外的参数,所以它不能自动用于将std::string转换为Grade }。只有可以使用单个参数调用的构造函数才能用于转换。

对于其他错误

int adjusted_grade = student1 + 4;

没有operator+需要Gradeint,而且无法将4转换为Grade,也没办法将Grade转换为可用于添加int的其他类型。