2016-08-01 13 views
-4

Ich schreibe einen Cheat für ein Offline-Spiel und habe eine Klasse namens Player, die dafür verantwortlich ist, Werte in einem anderen Prozess zu bekommen und zu setzen. Allerdings ist mein Design für diese Klasse sehr schlecht, da die Verwendung der Klasse Spieler sehr chaotisch und hässlich aussieht, sehr schwer zu lesen und pflegenBesseres Entwurfsmuster zum Lesen anderer Prozessspeicher?

// declare variables here to read 
if (Player.getthis() && Player.getthat() && Player.getthat() ... and so on) 
//do stuff 

class Player { 
... 
public: 
    ... 
    // either of these calls can fail, so I return TRUE on success and FALSE on failure 
    BOOL GetHealth(float& health); 
    BOOL SetHealth(float& health); 
    ... 
}; 

Also meine Frage ist, was ist ein besserer Weg, dies zu tun ? Auch: Ich muss nicht unbedingt jeden einzelnen Wert des Players im Speicher lesen, nur ein paar auf einmal. Deshalb habe ich nicht eine einzige Methode wie BOOL UpdatePlayer haben(), die alles lesen und aktualisieren den Spieler

+2

Warum Sie verwenden 'BOOL' anstelle des Schlüsselworts 'bool'? (Gleiches gilt für 'TRUE' /' FALSE' vs. 'true' /' false') – Borgleader

+0

Ich nehme an, der Cheat ist für eine Winapi-Anwendung. – drescherjm

+0

Es scheint, dass Ihr Code derzeit funktioniert und Sie versuchen, ihn zu verbessern. Im Allgemeinen sind diese Fragen für diese Site zu eigenartig, aber Sie könnten mehr Glück bei [CodeReview.SE] (// codereview.stackexchange.com/tour) finden. Denken Sie daran, [ihre Anforderungen] (// codereview.stackexchange.com/help/on-topic) zu lesen, da sie etwas strenger sind als diese Site. – FrankerZ

Antwort

1

Hier ist, wie ich es tun würde:

class Player { 
public: 
    class AccessException : public std::exception { 
     friend class Player; 
    public: 
     virtual const char *what() const noexcept { 
      return "Error getting property with key " + key; 
     } 

    private: 
     AccessException(const std::string &key) 
      : key(key) 
     {} 

     std::string key; 
    }; 

    float GetHealth() { 
     if (is_error) { 
      throw AccessException("health"); 
     } 

     return health; 
    } 

    float GetPosX() { 
     if (is_error) { 
      throw AccessException("posX"); 
     } 

     return posX; 
    } 
}; 

void do_stuff() { 
    try { 
     float health = player.GetHealth(); 
     float posX = player.GetPosX(); 
     // Use health and posX... 
    } catch (const AccessException &ex) { 
     std::cerr << ex.what() << std::endl; 
    } 
} 
+0

Warum haben Sie Ausnahmen hinzugefügt? –

+1

@KarolyHorvath Weil das buchstäblich genau das ist, wofür sie geschaffen wurden. – Joel

+0

für was? Ich meine ... nichts in der Frage des OP deutet darauf hin, dass er sie braucht. –