Ich habe eine Klasse, die einen Vektor einer anderen Klasse Objekte als Mitglied hat. In vielen Funktionen dieser Klasse muss ich dieselbe Operation für alle Objekte im Vektor durchführen:
class Small
{
public:
void foo();
void bar(int x);
// and many more functions
};
class Big
{
public:
void foo()
{
for (size_t i = 0; i < VectorOfSmalls.size(); i++)
VectorOfSmalls[i]->foo();
}
void bar(int x)
{
for (size_t i = 0; i < VectorOfSmalls.size(); i++)
VectorOfSmalls[i]->bar(x);
}
// and many more functions
private:
vector<Small*> VectorOfSmalls;
};
Ich möchte den Code zu vereinfachen, und einen Weg finden, nicht zu duplizieren gehen andere den Vektor in jeder Funktion.
Ich habe in Erwägung gezogen, eine Funktion zu erstellen, die einen Zeiger auf eine Funktion empfängt und die angezeigte Funktion für jedes Element eines Vektors aufruft. Aber ich bin mir nicht sicher, ob die Verwendung von Zeigern auf Funktionen in C++ eine gute Idee ist.
Ich habe mir auch Gedanken über Funktoren und Funktionsoide aber es wird mich zwingen, für jede Funktion eine Klasse zu erstellen, und das klingt nach einem Overkill.
Eine andere mögliche Lösung besteht darin, eine Funktion zu erstellen, die eine Zeichenkette empfängt und den Befehl entsprechend der Zeichenkette aufruft:
void Big::call_command(const string & command)
{
for (size_t i = 0; i < VectorOfSmalls.size(); i++)
{
if (command == "foo")
VectorOfSmalls[i]->foo();
else if (command == "bar")
VectorOfSmalls[i]->bar();
}
}
void Big::foo()
{
call_command("foo");
}
Aber es könnte langsam arbeiten (unnötige Erstellung einer Zeichenkette anstelle eines Funktionsaufrufs), und schafft auch ein Problem, wenn Funktionen unterschiedliche Signatur haben.
Was würden Sie also empfehlen? Sollte ich alles so lassen, wie es jetzt ist?
EDIT: Ich kann nur STL und nicht Boost verwenden (alte Compiler).