der >>operator überladen mit nem objekt

superharry hat gesagt.:
@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


Wieso sagst du einmal
"istream& operator (istream& instr, Klassen_name& Objektname)" (Rückgabe als Referenz)

und einmal
"std::istream operator >> (std::istream& in, Sportart& sport)" (ohne Referenz)

Kannste mir das mal bitte erläutern ? Mag ja sein das ich da ein wenig unterbelichtet bin um das auf anhieb zu verstehen...
 
MFC openGL 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.....
Ja, da hast du recht. Ich meinte die Version von Java/CppProgrammer. Das mit der Rückgabe per Wert ist mir bei superharry entgangen.

Korrekt sollte diese Signatur sein:
Code:
istream& operator (istream& instr, Klassen_name& Objektname)
Der Operator sollte innerhalb der Definition von Klassen_name als friend gekennzeichnet werden.
 
@ alle beide
ich gebe zu ich hab das mit den referenzen zurückgeben erst verschnitten
aber da mich java/cppProgammer darauf hingewiesen hat habe ich das in weiteren Code zeile ausgebessert
so wie es zuletzt gepostet wurde muß es heißen, meiner Meinung nach
 
superharry hat gesagt.:
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;
}

Und in der Klasse müsste dann stehen :

Code:
class....
 
public : friend std::istream& operator >> (std::istream& in, Sportart& sport);
....


Das ist das was ich (und ich glaube Kachelator auch) dir sagen wollten...
Das & fehlt, und das friend auch...
 
das hab ich ja auch begriffen aber was ich geneu wissen wollte, was ich in die funktion (istream& operator >>() ) hinein schreiben sollte
wo ich auch noch keien sehr guten ideen beigetragen habe!
 
Das kommt darauf an was du dort machen willst, willst du was aus einer Datei einlesen ? von der Tastatur ? über einen Port oder was ?

Könntest z.b. mit fgets() dir eine Datei auslesen, oder mit getline() nen String von der Tastatur holen, oder was du eben willst, da sind dir keinerlei Grenzen gesetzt !
 
MFC openGL hat gesagt.:
Das kommt darauf an was du dort machen willst, willst du was aus einer Datei einlesen ? von der Tastatur ? über einen Port oder was ?

Könntest z.b. mit fgets() dir eine Datei auslesen, oder mit getline() nen String von der Tastatur holen, oder was du eben willst, da sind dir keinerlei Grenzen gesetzt !

Grenzen gesetzt sind keine, aber man sollte es wenigstens so implentieren, das es zur
ursrünglich implementierten Bedeutung des jeweiligen Operators konsistent ist.
Und man sollte was mit den Objekten anstellen die man an den Operator übergeben
bekommt. :)

Gruß

RedWing
 
Das war schon klar, und ich denke auch nicht das ich dort dann z.b. eine Methode "Hallo Welt" starte. ;)

Klar sollte das schon was mit dem istream zutun haben...
 
also ich habe das so gemeint das man in der Main() schreibt cin>>sportart und auffen bildschirm dann "Wettlauf 4.5 5.8 2.9" schreibt und das dann in erst in nen string umwandelt den auseinander nimmt das die zahlen in nen vector gespeichert werden und die Sportart in ner string variable
aba ich hab mir den quelltext jetzt von nem kumpel geholt der war bischen schneller als ich trotzdem vielen dank an alle ;)
Code:
std::istream operator >> (std::istream in, Sportart& sport)
{//sportart eingeben
	vector <double> hilfe;
	string temp;
	string wort;
	getline(in,temp);
	istringstream iss(temp);
	iss>>wort;
	if(wort == "")
	{
		in.setstate(ios::failbit);
	}
	else
	{
		double zahl;
		while(iss>>zahl);
		{
			hilfe.push_back(zahl);
		}
		sport.werte= hilfe;
		sport.bezeichnung = wort;
	}
	in>>sport;
	return in;
}
 
Zurück