Pregunta

Cuando tengo un archivo de encabezado como este:

#ifndef GAMEVIEW_H_
#define GAMEVIEW_H_

#include <SDL/SDL.h>

class GameView
{
public:
 GameView();
 virtual ~GameView();

 virtual void Update() = 0;
 virtual void Render(SDL_Surface* buffer) = 0;
};

#endif /* GAMEVIEW_H_ */

Necesito crear un .cpp Archivo así:

#include "GameView.h"

GameView::~GameView()
{

}

GameView::GameView()
{
}

Esto es un poco estúpido. Solo un archivo .cpp para un constructor vacío y deconstructor. Quiero implementar ese método simplemente en el archivo de encabezado. Eso es mucho más limpio.

¿Como hacer esto?

¿Fue útil?

Solución

Puedes definir tu constructor y incinerador de basuras (Este es el término apropiado, use esto en lugar de deconstructor) en línea:

class GameView
{
public:
 GameView() {}
 virtual ~GameView() {}

 virtual void Update() = 0;
 virtual void Render(SDL_Surface* buffer) = 0;
};

Otros consejos

Quiero implementar ese método simplemente en el archivo de encabezado. Eso es mucho más limpio.

Que así sea.

// ...
GameView() { }
virtual ~GameView() { }
// ...

Ni siquiera necesitas escribir esto. El compilador proporciona un constructor predeterminado en sí. Lo único que necesita es el destructor porque no es virtual de forma predeterminada.

En caso de que haya escuchado que necesita definirlos en el archivo .cpp, esto a veces es necesario si tiene consejos inteligentes en su clase como miembros. Una regla general es que cuando tienes consejos inteligentes en tu clase, y señalan una clase que solo se declara en el encabezado, siempre proporciona constructores y destructores en el archivo .cpp donde realmente define la clase puntiaguda. De lo contrario, puede obtener problemas con la eliminación de clases incompletas (causando un comportamiento indefinido en muchos casos).

#ifndef GAMEVIEW_H_
#define GAMEVIEW_H_

#include <SDL/SDL.h>

class GameView
{
public:
 GameView() {}
 virtual ~GameView() {}

 virtual void Update() = 0;
 virtual void Render(SDL_Surface* buffer) = 0;
};

#endif /* GAMEVIEW_H_ */

No veo tu problema:

class GameView
{
public:
 GameView() {}
 virtual ~GameView() {}

 virtual void Update() = 0;
 virtual void Render(SDL_Surface* buffer) = 0;
};

Y, por supuesto, si el constructor no hace nada, no hay necesidad de proporcionarlo todo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top