Первый раз здесь, но я задержусь на пару месяцев. В настоящее время балуется 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 («Билл Миллер», 0), но я где-то ошибаюсь. Я могу только представить, что все, что исправит это, также исправит проблему с операндом, обновив оценку студента 1 при назначении новой переменной на основе ее текущей назначенной оценки. Что-то подсказывает мне, что это может быть просто так, как структура структурирована в данный момент, где, возможно, перегрузка operator + должна быть похожа на «int Grade :: operator + (const Grade &) «а не» Оценка класса: оператор + (постоянная оценка) &) «, но все мои попытки найти правильный синтаксис до сих пор были тщетными.
Любое направление, в котором вы могли бы указать мне, чтобы лучше понять, как выйти из ситуации, в которой я нахожусь, было бы абсолютно превосходным, просто не дайте мне ответ прямо (конечно) !! Поскольку это задание для класса, любые предложения должны относиться только к Grade.cpp и Grade.h, поскольку GradeMain предоставляется инструктором.
Большое спасибо за чтение 🙂
Когда ты сказал
student2 = "Bill Miller";
это будет включать два пользовательских преобразования: одно из const char *
к std::string
, а другой от std::string
к Grade
, Однако C ++ допускает только одно автоматическое пользовательское преобразование.
Кроме того, у вас есть конструктор, который принимает std::string
, но он также принимает дополнительный параметр, поэтому он не может быть использован автоматически для преобразования std::string
к Grade
, Только конструкторы, которые могут быть вызваны с одним аргументом, могут быть использованы для преобразования.
Для другой ошибки
int adjusted_grade = student1 + 4;
здесь нет operator+
это занимает Grade
и int
и нет возможности конвертировать 4
к Grade
и нет способа конвертировать Grade
к другому типу, который может быть использован с добавлением int
,