如何从同一个类中的另一个运算符重载成员函数调用运算符重载成员函数(或使用运算符)?

2024-02-01

我正在用 C++ 编写一段代码来处理复数。我也在练习运算符重载。所以我超载了*(乘法运算符),现在我想在我的重载中使用重载运算符/(除法运算符),但是当我使用时*它的显示错误。这是代码:

#include <iostream>
#include <cmath>

using namespace std;

class Imaginary
{
    public:
    //constructors
    Imaginary(double a,double b):x(a),y(b){}
    Imaginary():x(0.0),y(0.0){}

    //setter methods for x and y
    void Setx(double x) { this->x = x; }
    void Sety(double y) { this->y = y; }

    //getter methods for x and y
    double Getx(){return this->x;}
    double Gety(){return this->y;}

    //overloaded operators
    Imaginary operator+(Imaginary&);
    Imaginary operator-(Imaginary&);
    Imaginary operator*(Imaginary&);
    Imaginary operator~();
    Imaginary operator/(Imaginary&);

    void print();
private:
    double x;
    double y;
};

Imaginary Imaginary::operator+(Imaginary &i){
    Imaginary ti;
    ti.Setx(this->x+i.x);
    ti.Sety(this->y+i.y);

    return ti;
}

Imaginary Imaginary::operator-(Imaginary &i){
    Imaginary ti;
    ti.Setx(this->x-i.x);
    ti.Sety(this->y-i.y);
    return ti;
}

Imaginary Imaginary::operator*(Imaginary &i){
Imaginary ti;
ti.Setx((this->x*i.x) - (this->y*i.y));
ti.Sety((this->y*i.x)+(this->x*i.y));
return ti;
}

Imaginary Imaginary::operator~(){
int y;
y = this->y;
this->y = -y;
return *this;
}

Imaginary Imaginary ::operator/(Imaginary &i){
Imaginary numerator,denominator,ti;
//i want to use here the overloaded *(multiplacation) operator
numerator = (*this) * (~i);//showing error
denominator = (*this) * (~i);//showing error
ti.Setx(numerator.Getx()/denominator.Getx());
ti.Sety(numerator.Gety()/denominator.Getx());

return ti;
}

void Imaginary::print(){
cout<<x;
if (y>0)
cout<<"+i"<<y<<endl;
else if (y<0)
cout<<"-i"<<abs(y)<<endl;

}

int main()
{   
Imaginary res;
Imaginary z1(2,3);
Imaginary z2(1,-1);
z1.print();
z2.print();

/*res = z1+z2;
cout<<"Addition:-\n";
res.print();

res = z1-z2;
cout<<"Subtraction:-\n";
res.print()*/

res = z1*z2;
cout<<"Multiplication:-\n";
res.print();

res = z1/z2;
cout<<"Division:-\n";
res.print();

return 0;
}

错误消息如下:-

D:\Games\Cheese\main.cpp|66|error: no match for 'operator*' (operand types are 'Imaginary' and 'Imaginary')|

请任何人告诉我如何纠正它。


在这种情况下,该错误并不是最好的错误。你的operator*定义为

Imaginary Imaginary::operator*(Imaginary &i)

这要求右侧是左值。当你这样做时

(*this) * (~i)

in operator/, (~i)returns Imaginary这是一个右值。您无法将该右值绑定到 lavue 引用,因此不会考虑您的重载,并且您会收到编译器错误。

解决这个问题最简单的方法是采取const &相反喜欢

Imaginary Imaginary::operator*(const Imaginary &i)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从同一个类中的另一个运算符重载成员函数调用运算符重载成员函数(或使用运算符)? 的相关文章

随机推荐

  • 在页面内的 div 中显示控制台错误和警报

    我正在为我的网络应用程序构建一个调试工具 我需要在 div 中显示控制台错误 我知道我可以使用自己制作的类似控制台的对象并使用它 但为了将来的使用 我需要将所有控制台错误发送到 window 实际上我想捕获控制台事件 要保持控制台正常工作
  • create-react-app React Js 的漏洞

    每次我创建一个反应应用程序时npx create react app
  • jquery 选择删除选项

    我目前正在成功使用它来删除选项 select select gender option value initial remove 有没有办法删除选项而不添加到选择器 如下所示 select select gender val initial
  • 过滤涉及安全约束的请求

    我有一个 Java Web 应用程序 它使用安全约束来锁定对资源的访问 当 Ajax 请求需要身份验证时 我尝试操纵 HTTP 401 响应 因此我创建了一个过滤器来观察响应中的 HTTP 状态并根据需要进行相应修改 问题是 似乎如果需要身
  • 使用lambda表达式连接pyqt中的槽

    我正在尝试将插槽与 lambda 函数连接起来 但它没有按我预期的方式工作 在下面的代码中 我成功正确连接了前两个按钮 对于我循环连接的后两个 这是错误的 之前有人问过同样的问题 Qt 使用 lambda 将槽与参数连接 https sta
  • OrderedDict 不按顺序排列

    这个循环的想法是迭代列表 如果对象的某个属性不是 OrderedDict 的键 则会添加它 它是对象列表的字典 for object in someList if object DATE not in myOrderedDict myOrd
  • 使 Omni 能够在 Windows 上的 vim 7.2 上运行

    我正在尝试将 Omni Complete 功能与 gVim 7 2 一起使用 但在 Windows 上我不断收到一条错误消息 错误 需要使用 python 编译 vimE117 未知功能 pythoncomplete complete 看起
  • 如何确定变量的内存占用(大小)?

    PHP 或 PHP 扩展 中是否有函数可以找出给定变量使用了多少内存 sizeof只是告诉我元素 属性的数量 memory get usage有帮助的是它给了我所使用的内存大小whole脚本 有没有办法对单个变量执行此操作 请注意 这是在开
  • django 排除的性能问题

    我有一个 Django 1 8 应用程序 并且使用 MsSQL 数据库 以 pyodbc 作为数据库后端 使用 django pyodbc azure 模块 我有以下型号 class Branch models Model name mod
  • BroadcastReceiver如何启动新意图

    我实现了一个广播接收器 以便在互联网连接丢失时 阻止 我的应用程序 我所说的阻止是指应用程序必须打开 无互联网连接 活动 这是我的接收器代码 public class ConnectivityReceiver extends Broadca
  • Gradle:将所有测试依赖项复制到 zip 文件

    我对 gradle 很陌生 所以也许我问的问题很简单 我正在寻找一种解决方案 将 testCompile 范围内的所有依赖项放入 zip 文件中 我检查了http forums gradle org gradle topics how do
  • 如何在 JavaScript 中访问当前范围之外的变量?

    我正在用 javascript 编写一个应用程序 但无法弄清楚如何访问此 jquery 解析中函数中声明的变量 在内部我可以访问全局变量 但我真的不想为这些值创建全局变量 基本上我想从 xml 文档中提取文件名simulationFiles
  • chrome.identity.getAuthToken 不起作用

    我正在使用 Chrome Identity API 在我的 Chrome 扩展程序上为用户提供 Google 身份验证 我参考了Google官方教程 链接 Chrome 身份 API https developer chrome com a
  • BIRT 的 HTMLRenderReport 向嵌入图像添加类似“file://”的 url(而不是将它们嵌入到 HTML 中)

    我有一个 BIRT 报告 母版页中有一个图像 我的 BIRT 设计文件 我在报告中嵌入了一个 png 它在执行后生成了以下 XMLbody tag
  • JavaScript 中字符串的子类化

    我有一个字符串方法String prototype splitName 将作者姓名 字符串 拆分为名字和姓氏 该声明var name authorName splitname 返回一个对象字面量name with name first an
  • 回调 after_destroy 未通过 ActiveAdmin 触发

    我使用 ActiveAdmin 作为我的应用程序的后台 我有以下三个模型 class Organization has many organization collection relations has many collections
  • JTextField:文本太长时如何在 JTextField 左侧设置文本

    我有一个很长的String我想显示在JTextField 如果String太长了 它显示的是右侧部分String 而不是左边部分 即使我使用setHorizontalAlignment JTextField LEFT 例如 如果我的Stri
  • 发送后10秒使用JDA删除消息

    我正在制作一个不和谐的机器人 它发送一个嵌入来显示用户库存 我正在制作一个游戏机器人 为了避免混乱 我想在 10 20 秒后删除该消息 任何人都知道我该怎么做 如果你完全理解这些问题 那么请不要说 哦 你需要遵循等等格式 我正在使用 Jav
  • ISO-8859-1(正确/错误)

    这是真话还是假话 Unicode 是 ISO 8859 1 的超集 因此前 256 个 Unicode 字符对应于 ISO 8859 1 规范的编码 ISO 8859 1 仅包含 256 编码 也就是说 没有什么比 256 个代码更多的了
  • 如何从同一个类中的另一个运算符重载成员函数调用运算符重载成员函数(或使用运算符)?

    我正在用 C 编写一段代码来处理复数 我也在练习运算符重载 所以我超载了 乘法运算符 现在我想在我的重载中使用重载运算符 除法运算符 但是当我使用时 它的显示错误 这是代码 include