2017-09-21 165 views
-2

我试图重载一个操作符来处理项目类并因为字符串而产生一些困难。这将被分割成一个头文件和另一个文件。 (编辑:哎呀,对不起)运算符重载'<<' and '>>'和一个字符串

#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; 
} 
+3

如果'getitemName'是一个问题,显示它是有点强制性 – StoryTeller

+0

你可能对运营商''>>这是为了养活一个问题你在参数中给出的项目(通过方法getItemName()')。但是这个参数的类型是'const item&',这有点奇怪。请显示'getiemName'函数实现 – Actarus

回答

3
  1. >>操作将会变异的item,所以它必须通过一个可变的,不是常量的参考。

  2. item已声明流操作符函数是朋友,所以他们可以不受限制地访问内部状态。

-

#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

随着getItemName()你得到一个值,而不是对它的引用。
你做这样的事情

instr>>"hello" 

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

你应该这样做:

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

的方法是friend,所以它可以毫无问题访问您的私有成员!

欲了解更多信息有关rvalueslvalues您可以检查here

+0

将问题缩小到>>操作符。 – Caschmitt

+1

我不确定在这里了解您的评论 – magicleon

相关问题