鱼C论坛

 找回密码
 立即注册
查看: 1167|回复: 2

[已解决]关于运算符重载的一个问题

[复制链接]
发表于 2018-9-10 10:52:38 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <bits/stdc++.h>
  2. #define rep(i,a,n) for(int i=a;i<n;++i)
  3. #define pb push_back
  4. #define close() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
  5. #define INF 0x3f3f3f3f
  6. using namespace std;
  7. typedef pair<int,int>P;

  8. class Node{
  9. private:
  10.     double x,y;
  11. public:
  12.     Node(){x=0,y=0;}
  13.     Node(double x,double y){this->x=x,this->y=y;}
  14.     Node operator+(const Node &p){
  15.         Node sum;
  16.         sum.x=x+p.x;
  17.         sum.y=y+p.y;
  18.         return sum;
  19.     }
  20.     Node operator-(const Node &p){
  21.         Node sum;
  22.         sum.x=x-p.x;
  23.         sum.y=y-p.y;
  24.         return sum;
  25.     }
  26.     void Show(){
  27.         cout<<x<<" "<<y<<endl;
  28.     }
  29.     Node operator*(double n){
  30.         Node sum;
  31.         sum.x=x*n;
  32.         sum.y=y*n;
  33.         return sum;
  34.     }
  35.      /*
  36.     friend Node operator*(double n,Node p){
  37.         Node sum;
  38.         sum.x=p.x*n;
  39.         sum.y=p.y*n;
  40.         return sum;
  41.     }
  42.     */
  43.     Node operator*(double n,const Node& p){
  44.         return p*n;
  45. }
  46. };



  47. int main()
  48. {
  49.     Node p1;
  50.     Node p2(3,4);
  51.     Node p3(4,5);
  52.     p2=p2+p3;
  53.     p2=5*p2;
  54.     p2.Show();
  55.     return 0;
  56. }
复制代码

为什么注释下面的return p*n会报错呢?C++ primer plus上说可以把友元函数改成return p*n 这种,为啥不对呢?
最佳答案
2018-9-10 11:51:18
本帖最后由 qq1242009750 于 2018-9-10 11:52 编辑

   Node operator*(double n,const Node& p){
        return p*n;   }
参数太多了,这个最多也就跟一个参数   自己 + 1参数 == 二元运算符

  1. #include <iostream>
  2. #define rep(i,a,n) for(int i=a;i<n;++i)
  3. #define pb push_back
  4. #define close() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
  5. #define INF 0x3f3f3f3f
  6. using namespace std;
  7. typedef pair<int, int>P;

  8. class Node {
  9. private:
  10.         double x, y;
  11. public:
  12.         Node(int i) { x = i; y = i; }
  13.         Node() { x = 0, y = 0; }
  14.         Node(double x, double y) { this->x = x, this->y = y; }
  15.         Node operator+(const Node &p) {
  16.                 Node sum;
  17.                 sum.x = x + p.x;
  18.                 sum.y = y + p.y;
  19.                 return sum;
  20.         }
  21.         Node operator-(const Node &p) {
  22.                 Node sum;
  23.                 sum.x = x - p.x;
  24.                 sum.y = y - p.y;
  25.                 return sum;
  26.         }
  27.         void Show() {
  28.                 cout << x << " " << y << endl;
  29.         }
  30.         Node operator*(double n) {
  31.                 Node sum;
  32.                 sum.x = x * n;
  33.                 sum.y = y * n;
  34.                 return sum;
  35.         }
  36.        
  37. //    friend Node operator*(double n,Node p){
  38. //            Node sum;
  39. //            sum.x=p.x*n;
  40. //            sum.y=p.y*n;
  41. //            return sum;
  42. //    }
  43.    

  44.         Node operator*(Node &n) {
  45.                 Node tmp;
  46.                 tmp.x = x * n.x;
  47.                 tmp.y = y * n.y;
  48.                 return tmp;
  49.         }
  50. };



  51. int main()
  52. {
  53.         Node p1;
  54.         Node p2(3, 4);
  55.         Node p3(4, 5);
  56.         p2 = p2 + p3;
  57.         p2 = (Node)5 * p2;        //把5强制转换为Node类型  但前提是Node必须有一个int类型的构造函数  不用此方法请使用友元函数
  58.         p2.Show();
  59.         return 0;
  60. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-9-10 11:02:28 | 显示全部楼层
这好像变成了自己调用自己的无限递归了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-9-10 11:51:18 | 显示全部楼层    本楼为最佳答案   
本帖最后由 qq1242009750 于 2018-9-10 11:52 编辑

   Node operator*(double n,const Node& p){
        return p*n;   }
参数太多了,这个最多也就跟一个参数   自己 + 1参数 == 二元运算符

  1. #include <iostream>
  2. #define rep(i,a,n) for(int i=a;i<n;++i)
  3. #define pb push_back
  4. #define close() ios::sync_with_stdio(false);cin.tie(0);cout.tie(0)
  5. #define INF 0x3f3f3f3f
  6. using namespace std;
  7. typedef pair<int, int>P;

  8. class Node {
  9. private:
  10.         double x, y;
  11. public:
  12.         Node(int i) { x = i; y = i; }
  13.         Node() { x = 0, y = 0; }
  14.         Node(double x, double y) { this->x = x, this->y = y; }
  15.         Node operator+(const Node &p) {
  16.                 Node sum;
  17.                 sum.x = x + p.x;
  18.                 sum.y = y + p.y;
  19.                 return sum;
  20.         }
  21.         Node operator-(const Node &p) {
  22.                 Node sum;
  23.                 sum.x = x - p.x;
  24.                 sum.y = y - p.y;
  25.                 return sum;
  26.         }
  27.         void Show() {
  28.                 cout << x << " " << y << endl;
  29.         }
  30.         Node operator*(double n) {
  31.                 Node sum;
  32.                 sum.x = x * n;
  33.                 sum.y = y * n;
  34.                 return sum;
  35.         }
  36.        
  37. //    friend Node operator*(double n,Node p){
  38. //            Node sum;
  39. //            sum.x=p.x*n;
  40. //            sum.y=p.y*n;
  41. //            return sum;
  42. //    }
  43.    

  44.         Node operator*(Node &n) {
  45.                 Node tmp;
  46.                 tmp.x = x * n.x;
  47.                 tmp.y = y * n.y;
  48.                 return tmp;
  49.         }
  50. };



  51. int main()
  52. {
  53.         Node p1;
  54.         Node p2(3, 4);
  55.         Node p3(4, 5);
  56.         p2 = p2 + p3;
  57.         p2 = (Node)5 * p2;        //把5强制转换为Node类型  但前提是Node必须有一个int类型的构造函数  不用此方法请使用友元函数
  58.         p2.Show();
  59.         return 0;
  60. }
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-24 11:32

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表