dyna/string5.hpp

Das folgende Code-Beispiel stammt aus dem Buch
Objektorientiertes Programmieren in C++ - Ein Tutorial für Ein- und Umsteiger
von Nicolai Josuttis, Addison-Wesley München, 2001
© Copyright Nicolai Josuttis 2001


#ifndef STRING_HPP
#define STRING_HPP

// Headerdatei für I/O
#include <iostream>

// **** BEGINN Namespace Bsp ********************************
namespace Bsp {

class String {

  protected:
    char*    buffer;    // Zeichenfolge als dynamisches Feld (Array)
    unsigned len;       // aktuelle Anzahl an Zeichen
    unsigned size;      // Speicherplatzgröße von buffer

  public:
    // Default- und char*-Konstruktor
    String (const char* = "");

    // Aufgrund dynamischer Komponenten:
    String (const String&);             // Copy-Konstruktor
    String& operator= (const String&);  // Zuweisung
    virtual ~String();                  // Destruktor (neu: virtuell)

    // Vergleichen von Strings
    friend bool operator== (const String&, const String&);
    friend bool operator!= (const String&, const String&);

    // Hintereinanderhängen von Strings
    friend String operator+ (const String&, const String&);

    // Ausgabe mit Streams
    virtual void printOn (std::ostream&) const;

    // Eingabe mit Streams
    virtual void scanFrom (std::istream&);

    // Anzahl der Zeichen
    // Beachte: darf beim Ableiten nicht überschrieben werden
    unsigned length () const {
        return len;
    }

  private:
    /* Konstruktor aus Länge und Puffer
     * - intern für Operator +
     */
    String (unsigned, char*);
};

// Standard-Ausgabeoperator
inline std::ostream& operator << (std::ostream& strm, const String& s)
{
    s.printOn(strm);    // String auf Stream ausgeben
    return strm;        // Stream zurückliefern
}

// Standard-Eingabeoperator
inline std::istream& operator >> (std::istream& strm, String& s)
{
    s.scanFrom(strm);   // String von Stream einlesen
    return strm;        // Stream zurückliefern
}

/* Operator !=
 * - als Umsetzung auf Operator == inline implementiert
 */
inline bool operator!= (const String& s1, const String& s2) {
    return !(s1==s2);
}

// **** ENDE Namespace Bsp ********************************

#endif  // STRING_HPP