c++ - 尝试重载运算符时出现错误 C2296 和 C3867
问题描述
我想重载运算符(作为自由函数)来处理分数,但出现了一些错误(23)。我的直觉告诉我 const 或类似的问题。现在对我来说有点复杂。那么如何解决这个问题或让这个主题更好呢?
错误 C2296“ ”:非法,左操作数的类型为“int (__thiscall
Rational:: )(void) const”错误 C2297“ ”:非法,右操作数的类型为“int (__thiscall Rational:: )(void) const”
- 错误 C3867 'Rational::Denominator':非标准语法;使用 '&' 创建指向成员的指针
#include <iostream>
#include <cmath>
using namespace std;
int GetGsd(int a, int b) { // Greatest common divisor
while (a > 0 && b > 0) {
if (a > b) {
a = a % b;
}
else {
b = b % a;
}
}
return a + b;
}
char GetSignOfFraction(int a, int b) {
if (a >= 0 && b > 0 || a <= 0 && b < 0) {
return '+';
}
else if (a < 0 || b < 0) {
return '-';
}
}
class Rational { // default c
public:
Rational() {
num = 0;
den = 1;
}
Rational(const int numerator, const int denominator) {
num = numerator / GetGsd(numerator, denominator);
den = denominator / GetGsd(numerator, denominator);
}
Rational& operator=(const Rational& r) { // overloaded =
Rational a{ r.num,r.den };
return a;
}
int Numerator() const {
char sign = GetSignOfFraction(num, den);
if (sign == '+') {
return fabs(num / GetGsd(num, den));
}
else {
return num / GetGsd(num, den);
}
}
int Denominator() const {
if (num == 0) {
return 1;
}
return fabs(den / GetGsd(num, den));
}
private:
int num;
int den;
};
Rational operator+(const Rational& lhs, const Rational& rhs) { // overloaded + // problem is there
Rational a;
a.Denominator = rhs.Denominator * lhs.Denominator;
a.Numerator = rhs.Numerator * lhs.Denominator + lhs.Numerator * rhs.Denominator;
a.Numerator /= GetGsd(a.Numerator, a.Denominator);
a.Denominator /= GetGsd(a.Numerator, a.Denominator);
return a;
}
bool operator==(const Rational& lhs, const Rational& rhs) { // and there
if (lhs.Numerator == rhs.Numerator && lhs.Denominator == rhs.Denominator) {
return true;
}
return false;
}
int main()
{
}
解决方案
您的代码在这里有几个问题。
您从该行和紧随其后的行中得到错误
a.Denominator = rhs.Denominator * lhs.Denominator;
这里有两个主要问题。
- 您正在尝试分配成员方法的值而不是调用它
- 即使您调用它,您也试图将值分配给返回的
const
int
您可以通过简单地在方法调用中添加括号来解决第一个问题a.Denominator()
,但是第二个错误更复杂。如果您想更改 a.den 的值(我认为这是您尝试做的),您将需要编写第二个可用于设置值的访问器。
void Denominator(int denominator){
den = denominator
}
然后调用它a.Denominator(/* My new value of a.den */)
推荐阅读
- yarnpkg - 更改纱线全局目录 - 我无法更改纱线全局安装文件夹
- d3.js - d3 和 webpack:__WEBPACK_IMPORTED_MODULE_0_d3__.scaleLinear 不是函数
- python - 读取每行非零元素的列号
- hibernate - Hibernate 5.2 Spring 4.3 MappingException:无法确定类型:sun.security.util.Password
- reactjs - Recharts 设置 Y 轴范围
- python - 如何使用 tkinter 按钮在条件下分别调用两个函数?
- codeigniter-3 - 如何在codeigniter中将发票数据插入数据库
- azure - 将 QueueClient.Create 转换为 MessagingFactory.CreateQueueClient
- javascript - 使用 Cordova 部署 android 构建后出现错误的字符
- c# - C# 线程池优先级