Istream überladen

Online-Skater

Erfahrenes Mitglied
Hallo liebe Tutorianer

Da ich ja nun OOP in C++ lerne experimentiere ich gerade mit Überladung von Operatoren.
Ich wüsste gerne wie ich per Eingabe(Konsole) einen Satz an mein CString-Objekt übergebe. Also CString ist die Klasse die ich geschrieben habe(Übung). Das Problem ich kann nur ein Wort einlesen aber sobald ein Leerzeichen kommt wird es abgeschnitten, was auch der Funktionsweise von cin entspricht. Aber ich weiß nicht wie ich es so hinbekomme das ich eben auch Sätze einlesen kann. Hie mein bisheriger Code.

C++:
// CString.cpp
// Input operator überladen
istream& operator>> (istream& IS, const CString& s)
{
    IS >> s.p;
    return IS;
}

// main.cpp
CString s1;
cin >> s1;    // Hier nimmt er logischer weise nur ein Wort 
// usw.
Brauche sowas wie getline() :)

mfg Thx schonma
 
Zeig mir ein Beispielcode ? Es geht darum das ich eine Eingabe per Stream in das Objekt laden kann
Und das mit dem Streamoperator ">>"(!)

Hie meine Klasse
C++:
class CString
{
	static short Index;
	char *p;
	short fn;
	int length;
  public:
	CString();
	CString(const char* s);
	CString(const CString& S);
	~CString();
	const CString& operator= (const CString& s);
	friend ostream& operator<< (ostream& OS,const CString& s);
	friend istream& operator>> (istream& IS,const CString& s);
 	const CString& operator+= (const CString& s);
	const CString& operator+= (const char* s);
	bool operator== (const CString& s) const;
	char& operator[] (int index);
	int size() {return length;}
};

Aufgabenstellung:
Erweitern Sie die in vorherigen Übungen erstellte Klasse CString um die Operatoren << und >> zur Ausgabe bzw. zum Einlesen eines CString-Objekts. Da nachher nur Objekte ausgegeben bzw. eingelesen werden sollen, brauchen Sie keine Funktion für entsprechende Objektzeiger hier definieren. Beachten Sie beim Einlesen eines CString-Objekts, dass Sie im Voraus nicht wissen wie lange die Eingabe ist.
 
Zuletzt bearbeitet:
Bsp:
C++:
istream& operator>> (istream& IS, const CString& s)
{
  IS.getline(s.p, s.length);

  return IS;
}
Du mußt natürlich dafür sorgen, das genügend Speicher für den String zur Verfügung steht.

Gruß
 
Zuletzt bearbeitet:
Oh so einfach :rolleyes:
Nagut danke vielmals :)

Achja wegen der Speicherreservierung das geht dann wohl nicht mehr dynamisch oder ?
Da man ja im Vorraus nicht weis wieviel der User eingibt !?
 
Zuletzt bearbeitet:
Achja wegen der Speicherreservierung das geht dann wohl nicht mehr dynamisch oder ?
Da man ja im Vorraus nicht weis wieviel der User eingibt !?
Naja, gerade deswegen kann man es ja nur dynamisch machen.

Der istream wird auf den fail Zustand gesetzt wenn getline abbricht weil die Länge der eingegebenen Zeile zu groß ist und das Zeilenendezeichen noch nicht erreicht wurde.

Das kann man ja prüfen und ggf. mehr Speicher anfordern:
C++:
istream& operator>> (istream& IS, const CString& s)
{
  int gelesen = 0;
  while (! (IS.getline(s.p + gelesen, s.length - gelesen) || IS.bad() || IS.eof())) {
    IS.clear();

    gelesen += IS.gcount();
    char* tmp = s.p;
    s.p = new char[s.length + 100];

    std::copy(tmp, tmp + s.length, s.p);
    s.length += 100;
    delete[] tmp;
  }
  return IS;
}
Ist allerdings nicht getestet.

Gruß
 
Ja genau danke das funktioniert wunderbar ;-)
Als Perfektionist frage ich einfach mal rein theoretisch ob das in der String Klasse oder bei ähnlichnen Problemen auch so realisiert wurde ? Ich meine das der Speicherbereich mit einer konstanten Anzahl erweitert wird (z.B. 100). Es ist ja ein ganz klein bischen Speicherverschwendung :)

Aber für meine Zwecke ist das vollkommen ausreichend. Mit dynamisch meine ich ja eben genau das, das man nur so viel Speicher reserviert wie man braucht.

Thanks deep :p
 
Zurück