V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
b00tyhunt3r
V2EX  ›  C

istream& operator>>(istream& is,XXX& x) 到底怎么用??

  •  
  •   b00tyhunt3r · 2019-06-23 18:42:04 +08:00 · 2861 次点击
    这是一个创建于 2017 天前的主题,其中的信息可能已经有所发展或是发生改变。

    例如我要重载>> (cin) 运算符,上面这句话到底应该怎么写?怎么用?

    #include <iostream>
    using namespace std;
    
    istream& operator>>(istream& is,char*& x)            
    {return is;}                                         
    
    int main()
    {
      char* m = "aaaa";
      cin >> "bbbb" >> m;  //写入"bbbb"字符串到 m
    }
    

    以上这样写为什么行不通呢?????求大佬指点迷津!!!!!!

    9 条回复    2019-06-24 11:08:11 +08:00
    ysc3839
        1
    ysc3839  
       2019-06-23 19:50:19 +08:00 via Android
    怎么个行不通呢?????求大佬说清楚具体什么错误!!!!!!
    lrxiao
        3
    lrxiao  
       2019-06-23 20:34:35 +08:00
    1. array to pointer 是一个 rvalue
    2. const char*
    3. 这啥玩意,看起来就不太行
    lrxiao
        4
    lrxiao  
       2019-06-23 20:36:23 +08:00
    居然不用手机号...瞎打的就发出去了。不太行是指注释的这行看起来不能满足这个要求
    lollipop43
        5
    lollipop43  
       2019-06-23 20:38:39 +08:00   ❤️ 1
    运算符重载本质上还是一个函数,所以函数调用需要你传入数量类型匹配的实参。
    你的重载函数形参有两个:istream&和 char*&
    所以对应的调用就应该形如:cin >> m ;
    再看你的写法:cin >> "bbb" >> m;
    你的写法实际是两个函数调用,第一个:cin >> "bbb"
    这里使用"bbb"就是行不通的,他需要一个变量的引用,"bbb"是一个常量,当然不可以。
    第一函数调用返回了 istream&,所以可以链式调用,这是理论可行的,然而你第一个调用已经出错了,后面的自然无法进行,若是第一个调用能正常返回 istream&,按上述分析即可。
    ====
    也没见过这么写的,一般都是为类方法重载,具体怎么使用看几个例子就明白了。
    ipwx
        6
    ipwx  
       2019-06-23 20:39:30 +08:00   ❤️ 2
    1. 我也就不吐槽你写入数据到一段不知道多长的内存是多么危险的事情了。
    2. 你是不是对 cin 的作用有所误解?它是从标准输入读入一段数据,而不是把一个变量复制到另一个变量。
    3. 你的需求用:memcpy

    http://ideone.com/jpdXE9
    SingeeKing
        7
    SingeeKing  
       2019-06-23 21:22:06 +08:00
    那个是重载,需要在类里 cin >> "bbbb" 一定错误因为 "bbbb" 不是你自己的类而是 char* 数组,你需要自己做一个类,比如

    class YY() {
    constructor(char* xx) {....}
    istream& operator>>(istream& is,XXX& x){...; return isl}
    }

    cin >> YY("xxx") ;

    写入"bbbb"字符串到 m 更不是这么用的,cin 是从流读而不是你的代码中的变量常量
    shoujiaxin
        8
    shoujiaxin  
       2019-06-23 21:33:35 +08:00 via iPhone
    你要重载的运算符是>>,cin 不是运算符,它是一个 istream 的对象。
    no1xsyzy
        9
    no1xsyzy  
       2019-06-24 11:08:11 +08:00
    istream& operator>>(istream& is,char*& x)
    这个定义无法匹配到 cin >> "bbbb" 这一部分。
    因为 "bbbb" 不是 char*& 类型的而是 const char* 类型的。
    首先它是个 const,其次它不可变所以不能有 &。
    ——
    请明述需求。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1144 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:09 · PVG 07:09 · LAX 15:09 · JFK 18:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.