Cowd wewuw #1
Loading…
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Her ville
være at foretrække, da
Game game = Game();i C++-sprog betyder lav enGameog kopier/flyt den ind iGame game, hvor at det ovenfor betyder lave enGame game. I C++ er det ikke muligt at lave en uninitialized variable, udover primitives, så iGame game;ergameinitialized.Dette kode er ikke thread safe.
Game::update()ogGame::run()kan køre samtidig og lave undefined behavior. Jeg ville brugestd::mutexogstd::lock_guard.Per convention plejer man at definere små constructors of destructors i header'en. Så har man dem samme sted som default-værdierne, og man kan derved nemt se, hvordan en klasse bliver initialiseret. Samtidig gør at det kompileren altid kan inline constructor'en, som kan hjælpe med const initializering.
Du kan bruge en
std::jthreadistedet. Den requester join og joiner automatisk, når dens destructor bliver kaldet. På denne måde kan du slippe af medGame::~Game(). Man foretrækker oftest at undgå eksplicitte destructors, hvis man ikke behøver at free ressourcer selv.I 'best practice' C++ ville man istedet 1) throw exceptions her, så man kan fange dem senere, 2) delegate operationer der kan fejle til en anden funktion, eller 3) initialisere en 'invalid'
GameRender, som man fx kan tjekke med enGameRender::operator bool()-funktion.Som eksempel på exception kunne det være:
Undgå at tage 'reference'-pointers som pointers i constructors. Pass istedet by reference, og tag pointeren i initializeren.
På denne måde undgår man, at man kan pass
nullptri constructuren. Dog noter, at man ikke bør have references som class-members.Dette gælder også
Player::Player(GameRenderer*).Det ligner, at
prev_tilesher burde passes som enconst std::vector<...>&og ikkestd::vector<...>. Ellers bliver der lavet en kopi af vector'en, hver gang man kaldergenerate_tiles.Jeg ville nok lave et
Tile-objekt eller noget lignende, som selv ved om den ergrassellerpath, hvorpå man bare kaldertile->draw(renderer). Switching er typisk et anti-pattern i sådanne context.Undgå
constdata-member. Det kan fucke med dine move-constructors. Lav den istedetstatic(ogconstexpr)Brug
enum classistedet.Dette er mest personligt: Undgå at expose SDL-headers i din headers. SDL er et C-library, der ikke bruger C++-namespaces, så din global namespaces bliver bloated med alt muligt.
Det er flere måder at undgå det på, men du kan fx gøre sådan her:
Dette gælder også:
https://git.reim.ar/ReiMerc/zombo-shooter/src/branch/master/Makefile#L15
Jeg ved ikke hvilke CFLAGS dit system har by default, men jeg ville tilføje en
CXX_FLAGS-variabel til debugging med følgende:Og til release: