handdator

Visa fullständig version : Klasser



gejben
2013-08-06, 21:35
Hej,

Är väldigt färsk på C++ och går nu en kurs där jag lär mig detta och DirectX.
Jag är tidigare (mer) van vid att programmera i C och Java och jag känner mig lite osäker på när jag ska använda klasser i c++.

Vi håller nu på med ett enkelt projekt, jag ska göra en Space Invaders-klon. Jag har satt upp Win32koden i en WinMain.cpp och ska kalla funktioner som sköter spellogiken.

Hade jag gjort som när jag skriver Java hade jag haft ett Game-objekt som innehöll dessa funktioner, typ såhär:



Game.h:

#ifndef GAME_H
#define GAME_H

#include <Windows.h>

class Game
{

public:
bool Init(HWND);
void Update(HWND);
void End(HWND);

}
#endif

Game.cpp:

#include "WinMain.h"
#include "Directx.h"
#include "Game.h"
using namespace std;

/**Initialize the Game**/
bool Game::Init(HWND hWnd)
{
if(!initD3D(hWnd)) return false;
}

void Game::Update(HWND hWnd)
{
ScreenUpdate();
}

void Game::End(HWND hWnd)
{
ReleaseD3D();
}


Och hade jag gjort på C-vis hade jag gjort såhär:



Game.h:

#ifndef GAME_H
#define GAME_H

#include <Windows.h>

bool GameInit(HWND);
void GameUpdate(HWND);
void GameEnd(HWND);

#endif

Game.cpp:

#include "WinMain.h"
#include "Directx.h"
#include "Game.h"
using namespace std;

/**Initialize the Game**/
bool GameInit(HWND hWnd)
{
if(!initD3D(hWnd)) return false;
}

void GameUpdate(HWND hWnd)
{
ScreenUpdate();
}

void GameEnd(HWND hWnd)
{
ReleaseD3D();
}



Så frågan är: vilket sätt borde jag skriva på, och varför?

PeterWelzien
2013-08-06, 23:30
Jag brukar ha ett game-objekt som i ditt Java-exempel. Det enda main() gör är att skapa en instans av detta objekt och anropa lämplig startmetod i det.

Jag använder både Java och C++ och jag bygger upp mina spel likandant i båda språken.

Jag tycker att det blir ganska smidigt samla metoder som jobbar på samma typ av data i samma klass. Men om du vill mer C-liknande så är det väl ingen som kan säga att det är fel.

gejben
2013-08-07, 07:54
Ok, så det är mest en smaksak och påverkar inte prestandan?

sirGustav
2013-08-07, 08:58
Allt påverkar prestandan, men troligtvis inget som spelar någon större roll.

Funderar dock på ditt första exempel, menar du att funktionerna skall vara statiska (http://www.learncpp.com/cpp-tutorial/812-static-member-functions/)?


Game game;
...
game.Update(hWnd)

eller


Game::Update(hWnd);

Kör man som i det första exemplet, så behöver man inte skicka runt x antal argument(obetydlig prestandavinst, men trevligare), och kan köra något sådant här istället:


void main() {
Game game(hWnd);
if( false == game.IsInitalized()) HandleError();
game.Update();
// inget End() anrop.
}

class Game {
public:
Game(HWND);
~Game();

bool IsInitialized() const;
void Update();
private:
HWND hWnd;
bool initialized;
};

Game::Game(HWND wnd) : hWnd(wnd), initialized(false) {
if(initD3D(hWnd)) initialized = true;
}

Game::~Game() {
if( initialized ) ReleaseD3D();
}

void Game::Update() {
assert(initialized && "Game is not initialized!");
ScreenUpdate();
}

bool Game::IsInitialized() const {
return initialized;
}

gejben
2013-08-07, 10:16
Nej jag hade inte tänkt använda statiska funktioner.
Det där såg ju mycket snyggare ut, tack!

Över lag sen då, när jag ska skriva kod för input, för direct3d och för ljud osv. Ska jag göra klasser för de också? Jag känner mig bekväm i båda sätten, men finns det något som är "best practice" så att säga?
Och inte bara i spel utan C++ generellt, är det vanligt att göra allt i klasser?