运营商超载'<<&#和'>>'和一个字符串

时间:2017-09-21 08:54:10

标签: c++ overloading

我试图重载操作符以对项类进行操作并因字符串而有一些困难。这将分为标题和另一个文件。 (编辑:哎呀,对不起。)

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <string>
using namespace std;

class item
{
private:
    string itemName;
public:
    string getitemName() const;
    friend std::istream &operator >> (std::istream & instr, const item& R);
    friend std::ostream &operator << (std::ostream & outst, const item& P);
};

string item::getitemName() const
{
return itemName;
}


std::istream& operator >> (std::istream& instr, const item& R)
{
instr >> R.getitemName();
return instr;
}

std::ostream& operator << (std::ostream& outst, const item& P)
{
outst << P.getitemName();
return outst;
}

2 个答案:

答案 0 :(得分:3)

  1. &gt;&gt;运算符将改变item,因此必须传递对mutable的引用,而不是const。

  2. item已宣布流媒体运营商为朋友,因此他们可以自由地访问内部州。

  3. -

    #include <iostream>
    #include <iomanip>
    #include <cstdlib>
    #include <string>
    using namespace std;
    
    class item
    {
    private:
        string itemName;
    public:
        friend std::istream &operator >> (std::istream & instr, item& R);
        friend std::ostream &operator << (std::ostream & outst, const item& P);
    };
    
    std::istream& operator >> (std::istream& instr, item& R)
    {
    instr >> R.itemName;
    return instr;
    }
    
    std::ostream& operator << (std::ostream& outst, const item& P)
    {
    outst << P.itemName;
    return outst;
    }
    

答案 1 :(得分:1)

使用getItemName()您获得的是值,而不是对它的引用 你正在做类似

的事情
instr>>"hello"

这是没有任何意义的,因为“你好”,就像getItemName()的结果是rvalue一样。

你应该这样做:

std::istream& operator >> (std::istream& instr, const item& R){
    instr >> R.itemName;
    return instr;
}

该方法是friend,因此它可以毫无问题地访问您的私人成员!

有关rvalueslvalues的详情,请查看here