2017-09-21 3 views
-2

Ich versuche, einen Operator zu überlasten, um auf die Elementklasse zu reagieren und einige Schwierigkeiten wegen der Zeichenfolge zu haben. Dies wird in eine Kopfzeile und eine andere Datei aufgeteilt. (Edit:. Oops, sorry)Operator überlastet '<<' and '>>' und eine Zeichenfolge

#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

Wenn 'getitemName' ein Problem ist, zeigt es irgendwie obligatorisch ist – StoryTeller

+0

Sie werden wahrscheinlich ein Problem auf dem' Betreiber >> 'die angeblich zu füttern das Item, das Sie in Parameter angeben (über die Methode 'getItemName()'). Aber der Parameter ist vom Typ const item &, was ein bisschen seltsam ist. Bitte zeigen Sie die 'getiemName' Funktion Implementierung – Actarus

Antwort

3
  1. der >> Betreiber wird die item mutieren, so dass es einen Verweis auf einen veränderbaren übergeben werden muß, nicht konst.

  2. item hat die Streaming-Operator-Funktionen als Freunde deklariert, so dass sie uneingeschränkten Zugriff auf den internen Status haben.

-

#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

Mit getItemName() Sie bekommen einen Wert, kein Hinweis auf sie.
Sie tun so etwas wie

instr>>"hello" 

und dies macht keinen Sinn, da „Hallo“, wie das Ergebnis von getItemName() ein rvalue ist.

Sie sollten dies tun:

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

Verfahren ein friend sind, so ist es um privates Mitglied ohne Probleme zugreifen kann!

Für weitere Informationen über rvalues und lvalues können Sie überprüfen, here

+0

eingegrenzt das Problem auf den >> Operator. – Caschmitt

+1

Ich bin mir nicht sicher, ob Sie Ihren Kommentar hier verstanden haben – magicleon

Verwandte Themen