Hab mir das jetzt auch noch mal angeguckt:
ich benutze für den std-namespace den vollqualifizierten Namen, ohne den std-Namespace zu öffnen. Die fünf Zeichen mehr machen beim Schreiben den Braten nicht fett und man erkennt sofort, dass es etwas aus der STL ist.
übergib' notwendige Parameter nicht als Zeiger, sondern als Referenz. Ich halte mich dabei an folgende Faustregel:
der Parameter ist optional: Übergabe als (const) Zeiger
der Parameter ist notwendig und kann verändert werden: Übergabe als Referenz
der Parameter ist notwendig und darf nicht verändert werden: Übergabe als const-Referenz
benutz' so viel aus der STL wie möglich und vermeide handgeschriebene Schleifen. Die C++ Lösung deiner removeSpaces Funktion könnte so aussehen:
#include <string>
#include <algorithm>
#include <cctype>
#include <iostream>
std::string RemoveSpaces( std::string const& str )
{
std::string retval;
auto predicate = []( char ch )
{
return !std::isspace( ch );
};
std::copy_if( str.begin(), str.end(), std::back_inserter( retval ), predicate );
return retval;
}
oder in-situ auf der Variable selbst
#include <string>
#include <algorithm>
std::string str = "abc def";
str.erase( std::remove( str.begin(), str.end(), ' ' ),
str.end() );
warum legst du deine Variablen überhaupt per new an? Wenn du sie in einem std::unordered_set hältst werden deren Adresse auch nicht ungültig (es sei denn, du löschst das Element aus dem set), du kannst also die Variable als value im set halten und trotzdem mit deren Adressen arbeiten. Habe mir jetzt aber auch nicht so genau angeguckt, was du mit den Adressen so alles anstellst.
vermeide besitzende Rohzeiger und benutz' stattdessen die smart pointer der STL.
Edit:
Generell arbeitest du zu wenig mit Rückgabewerten aus Funktionen. Die freie Variable error ließe sich komplette entfernen, wenn die Funktion, die sie setzen, den Status statt void zurückgeben. Damit weiß der Aufrufer direkt, ob der Aufruf erfolgreich war oder nicht.
exit() ist in den allerwenigsten Fällen sinnvoll. Stell dir vor, du stellst deine Engine als Bibliothek zur Verfügung und unter bestimmten Umständen wird exit() aufgerufen und das Programm beendet. Das ist kann für böse Überraschungen sorgen, wenn die Scripting-Engine ein kleiner und unwichtiger Teil eines Programms ist, aber plötzlich das Programm beendet.