Ciao
Secondo me dovresti separare la dichiarazione dei metodi e delle variabili (nel file .hpp) dalla loro implementazione (nel file .cpp)
Facendo come fai tu, ogni volta che il file .hpp viene #incluso, tutto ciò che c'è al suo interno è come se venisse ridefinito, con conseguenti errori di definizioni multiple dello stesso simbolo.
Separando invece la dichiarazione dalla definizione, quando #includi il file .hpp istruisci il compilatore sulla presenza dei simboli, ma questi sono definiti una sola volta nel file .cpp, e tutto dovrebbe filare liscio.
Ecco un breve esempio per come devi fare:
file.hpp:
#ifndef __FILE_HPP__
#define __FILE_HPP__
#include <d3dutil.hpp>
class Mouse
{
public:
enum MouseButton
{
BUTTON_LEFT = 0x00,
BUTTON_RIGHT = 0x01,
BUTTON_MIDDLE = 0x02,
};
static Mouse &instance();
bool buttonUp(MouseButton button) const;
bool buttonDown(MouseButton button) const;
/* etc... */
private:
Mouse();
~Mouse();
bool create();
/* etc... */
// Dichiari soltanto le variabili static const, senza definirle
static const float WEIGHT_MODIFIER;
static const int HISTORY_BUFFER_SIZE;
IDirectInput8* input;
IDirectInputDevice8* device;
/* etc... */
};
#endif
file.cpp:
#include "file.hpp"
// Definisci le variabili static const
const int Mouse::HISTORY_BUFFER_SIZE = 10;
const float Mouse::WEIGHT_MODIFIER = 0.2f;
// Definisci il costruttore e il distruttore
Mouse::Mouse()
{
// constructor...
}
Mouse::~Mouse()
{
// destructor...
}
// Definisci le funzioni
Mouse &Mouse::instance()
{
static Mouse inst;
return inst;
}
bool Mouse::buttonUp(Mouse::MouseButton button) const
{
// return ...;
}
bool Mouse::buttonDown(Mouse::MouseButton button) const
{
// return ...;
}
bool Mouse::create()
{
// etc...
}
Luca