ich einige Daten in class
packen oft Fehler mit öffentlichen/globalen Zugriff zu verhindern und einige gemeinsame Methoden darauf bieten, zum Beispiel:„onEachSubelement (...)“ Methode für C++
class GameArea{
std::vector<Enemy*> enemies;
std::wstring name;
public:
void makeAllEnemiesScared();
Enemy * getEnemy(unsigned index);
};
GameArea
ist nur ein vereinfachtes Beispiel hier. Es wäre eine Art von benutzerdefinierten Container/Menager mit einigen spezialisierten Methoden (aber es ist nicht nur ein Container).
Die ideale Situation ist, wenn ich weiß, welche Operationen an jedem Enemy
auf einmal ausgeführt wird, und sie treten an mehreren Stellen, damit ich sie in GameArea
direkt erklären können (wie makeAllEnemiesScared()
).
Für andere Fälle, die ich mit gehen kann:
for(unsigned i=0; i<gameArea->getEnemiesCount(); i++){
Enemy * enemy = gameArea->getEnemy(i);
...
}
Aber es leidet unter einigen Nachteilen:
- Ich kann nicht C++ 11 sauber & schön
for(auto &Enemy : enemies)
Schleife verwenden, - Es ist nicht effizient (so viele Anrufe zu
getEnemy(index)
), - Es ist nicht ein Zweck für
getEnemy(index)
zu iterieren werfen alle Elemente - es ist nützlich, wenn wir einzelne oder wenige von ihnen auswählen möchten, hat es auch fürindex < enemies.size()
innen überprüfen - es ist schrecklich, es auf jedem Element in Schleife zu überprüfen.
HINWEIS: denke ich Fälle über, wenn ich etwas ganz Besonderes tun (nicht wert in GameArea
getrennt Methode zu schaffen, aber auf jedes Element von GameArea::enemies
).
Ich dachte über einige GameArea::onEachEnemy(... function ...)
Methode, die eine function
(oder vielleicht besser ein Lambda?) Als Parameter verwendet. Ist das eine gute Lösung?
Oder vielleicht anderen Ansatz sollte hier verwendet werden? Wie die std::vector
von GameArea
zurückgeben - die für mich ein bisschen "hässlich" aussieht. Ich möchte nicht, dass der Benutzer denkt, dass er Artikel direkt zu dieser vector
hinzufügen oder entfernen kann.
Ihr "onEachEnemy" Vorschlag klingt gut für mich. – molbdnilo
Ich gehe davon aus, dass alle "getEnemy" ist es, 'Feinde [i]' zurückzukehren? Dann können Sie die Funktion inline und der Compiler wird den Aufruf wahrscheinlich optimieren. Sie können den wiederholten Aufruf 'getEnemiesCount' auch vermeiden, indem Sie ihn vor der Schleife aufrufen und das Ergebnis speichern. Sie können auch eine Iterator-Schnittstelle bereitstellen oder, wie Sie sich fragen, eine "für jede" -Funktion erstellen. Aber vor allem sollten Sie Ihr Programm wahrscheinlich profilieren, um zu sehen, ob das wirklich der Flaschenhals ist, den Sie denken, dass es ist. –
Oh, und denken Sie daran, dass der Vektor 'operator []' - Funktion keine Grenzen prüft, es nimmt an, dass der Benutzer des Vektors darauf achten wird, nicht außerhalb der Grenzen zu gehen. Wenn Sie sich Sorgen über Ineffizienz machen, sollten Sie wahrscheinlich das Gleiche tun, d. H. Die Überprüfung der Grenzen von "getEnemy" abbrechen. Aber wie ich in meinem vorherigen Kommentar gesagt habe, * Profil * zuerst, und stellen Sie sicher, dass dies wirklich so ineffizient ist, wie Sie denken, dass es ist. –