der >>operator überladen mit nem objekt

superharry

Mitglied
also die klasse Sportart mit objekt sport gibt es hier
jetzt brauch ich das so, das ich in der main() nur nch schreiben brauch cin<<sport; und der will eine sportart vonmir wissen
vll kann mir jemand helfen
der eingabe operator soll eine ganze Zeile in einen string einlesen können ( mit getline(istream,string) denk ich mal) , aus dem string soll ein objekt vom Typ istringstream gebildet werden das soll dann noch in nen vector gepackt werden aba das schaf i dann sicher auch allein!
zu hab i mir das erst mal gedacht
std::istream operator >> (std::istream in, Sportart& sport)
{
string tmp;
string hilfz;
getline(in,hilfz);
std::istringstream s=std::istringstream(hilfz);
s>>tmp;
if (tmp.empty())
return in;
}
 
Ich helfe dir gerne, wenn ich kann, aber bitte
1. Codetags benutzen
2. Rechtschreibung benutzen (siehe Netiquette)

Übrigens muss der Stream als Referenz (std::istream&) übergeben werden, sonst erzeugst du eine lokale Kopie (nicht gut). Alles weitere sehe ich mir an, wenn du deinen Post in einen lesbaren Zustand gebracht hast. Du schafst das schon. :rolleyes:
 
Zuletzt bearbeitet:
also die Klasse Sportart mit Objekt sport gibt es hier
jetzt brauch ich das so, das ich in der main() nur noch schreiben brauch cin<<sport damit das Progi nur noch eine sportart von mir wissen.
vieleicht kann mir jemand helfen
der eingabe operator ">>" soll eine ganze Zeile in einen string einlesen können ( mit getline(istream,string) denk ich mal) , aus dem string soll ein objekt vom Typ istringstream gebildet werden, das soll dann noch in nen vector gepackt werden aba das schaf ich dann sicher auch allein!
zu hab i mir das erst mal gedacht
Code:
std::istream operator >> (std::istream& in, Sportart& sport)
{
string tmp;
string hilfz;
vector <string> art
getline(in,hilfz);
std::istringstream s=std::istringstream(hilfz);
s>>tmp;
if (!tmp.empty())
art.push_back(tmp);
return in;
}
jo das sieht besser aus das mit code tags wußt i net
 
Ja, ein Schritt in die richtige Richtung.

Was soll denn eigentlich da eingegeben werden? Einfach nur der Name einer Sportart? Welche Eigensschaften hat die Klasse, d.h. wie ist sie definiert? Der ">>"-Operator (also Extraktionsoperator) hat ja die Aufgabe, ein Objekt aus einem Stream heraus zu deserialisieren. Da müsste man schon wissen, welche Eigenschaften überhaupt zu lesen sind. In deinem Operator wird das übergebene Objekt ja nicht benutzt, deshalb kann ich nicht so viel dazu sagen.
 
Zuletzt bearbeitet:
die Klasse Sportart
Code:
class Sportart
{
public:
	Sportart(std::string bezeichnug);
	Sportart();
	std::string bezeichnung;
	vector <double> werte;
	int anzahlWerte();
	double trend();
	std::string toString();
	std::string toString(double d);
};
es soll ehbent eine neue Sportar angelegt werden also der destruktor ausgelöst werden
von den istringstream zeug hab ich absolut keine ahnung und mein Lehrer konnte mir das auch nicht so erklären das ich das verstehe.
hier die aufgabe falls du da was raus lesen kannst "
" Der eingabe Operator für die Sportart ließt eine ganze Zeile in eine Hilfszeichenkette, Aus die er ein Hilfsobjekt vom Typ istringstream gebildet wird. Daraus soll ein Wort extrahiert werden."
der sinn der sache hab ich erst beim 5 mal lesen geschnallt
Code:
main()
{
Sportart sport;
cin<<sport;
}
so das man im Programm "Wettlauf12.410.9" als string eingeben kann .
also das "Wettlauf" in die sport.bezeichnung und die zahlen 12.4 und 10.9 den sport.werte Vector

PS noch ne Frage was sind gebrochene Zahlen
 
Okay, ich sitzt grad hier gelangweilt, also schreib ich dazu mal Code, den du für deinen Klasse nachbilden kannst:

PHP:
class Sportart{
..
..

string eingabe;


verarbeite(...){....}            //hier kannst du das eingegebene z.B. verarbeiten


istream &operator>>(istream &istr){
char s[200];                  //eigentlich unelegant, bin grad am suchen der besseren Lösung
cin.getline(s,200);
eingabe=s;
return(istr);
}


}
 
Habe mir das zwar nicht komplett durchgelesen was ihr zwei euch da gepostet habt, aber sieht so aus als ob in der Klassen Definition der "Prototyp" des überladenen Operators komplett fehlt.

Also gehört da noch folgendes rein :

friend std::istream& operator>> (std::istream& in, Sportart& sport);

friend deshalb, weil du die klasse istream benutzt, und diese nicht die sonst benötigten Rechte hat...


....zudem solltest du noch die Referenz zurückgeben, und nicht nur den Wert.
 
....zudem solltest du noch die Referenz zurückgeben, und nicht nur den Wert.
Tut er doch.

Ansonsten hast du recht.

char s[200]; //eigentlich unelegant, bin grad am suchen der besseren Lösung
Das Problem hatte ich auch ständig. Eine Lösung wäre es, stattdessen einen std::vector<char> zu verwenden. Hat noch jemand eine gute Idee, wie man std::strings einlesen kann?
 
Zuletzt bearbeitet:
Kachelator hat gesagt.:

Nein, tut er nicht ....

Code:
 std::istream operator >> (std::istream& in, Sportart& sport).......


Also für meine Augen fehlt da zwischen dem std::istream operator.....

das &, oder ist das egal wenn man das schon als Parameter übergeben hat ? (Wenn ja liege ich natürlich vollkommen daneben und dann kannste das natürlich so lassen @superharry)
 
@java/cppProgrammer
du hast das falsch verstanden glaub ich
wenn ich cin>>Objekt_name nehme
brauch ich doch
Code:
istream& operator (istream& instr, Klassen_name& Objektname)
{
  bla bla bla
}
wenn ich falsch liege bitte melden is aba trotzdem voll nett
Code:
std::istream operator >> (std::istream& in, Sportart& sport)
{
int start=0,ende=0;
	string wort;
	getline(in,wort);
	if (!wort.empty())
	{
		ende=wort.find(" ");
		sport.beziechnung=wort.substr(start,ende-start);
		wort.erase(start,ende-start+1);
		for (int i=0;i<wort.size();i++)
		{
			ende=wort.find(" ");
			sport.werte.push_back(wort.substr(start,ende-start));
			wort.erase(start,ende-start+1);
		}
	}
	else 
		in.clear(in.rdstate() & ~ios::failbit);//zum istream leeren (nicht von mir)
	return in;
}
mit der Eingabe "superharry 10.2 12.2"
sollte dann superharry in sport.bezeichnung und die Zahlen in den Vector schreiben
ich hab aber kein plassen schimmer ob das funktioniert bei mir jeden falls noch nicht
 
Zuletzt bearbeitet:
Zurück