#include <cstring>

// Allgemeines Template zum Aufsummieren von Daten
template <typename T>
class Sum
{
    T totalSum;     // Summe der Daten
public:
    // Verhindere Zuweisungen
    T& operator = (const T& rhs) = delete;
    // ctor, Summe loeschen
    Sum() : totalSum{}
    {}
    // Wert aufaddieren
    void Add(const T& val)
    {
        totalSum += val;
    }
    // Summe zurueckgeben
    T GetSum() const
    {
        return totalSum;
    }
};

// Spezialisiertes Template zum Aufsummieren von C-Strings
template<>
class Sum<const char*>
{
    char *totalSum; // Gesamt-String
public:
    // Verhindere Zuweisungen
    const char* operator = (const char* rhs) = delete;
    // ctor, Gesamt-String ist noch leer
    Sum() : totalSum{nullptr}
    {}
    // dtor, Speicher fuer C-String freigeben
    ~Sum()
    {
        delete[] totalSum;
    }
    // Aufsummieren von C-Strings
    void Add(const char* val)
    {
        // Stringlaenge des Parameteres
        auto len = strlen(val)+1;
        // Wenn noch kein C-String vorhanden
        if (totalSum == nullptr)
        {
            // Speicher reservieren und C-String umkopieren
            totalSum = new char[len];
            strcpy_s(totalSum, len, val);
        }
        else  // C-String bereits vorhanden
        {
            // Neue C-Stringlaenge berechen und Speicher reservieren
            len += strlen(totalSum);
            char *newSum = new char[len];
            // Alte Summe umkopieren
            strcpy_s(newSum, len, totalSum);
            // Neuen C-String anhaengen
            strcat_s(newSum, len, val);
            // Speicher der alten Summe freigeben
            delete[] totalSum;
            // Neue Summe uebernehmen
            totalSum = newSum;
        }
    }
    // Zeiger auf C-String zurueckgeben
    const char* GetSum() const
    {
        return totalSum;
    }
};