Probabilmente sui libri avrai letto anche che e` uso comune separare:

- prototipi e dichiarazioni (da inserire negli headers, .h/.hpp);
- implementazioni (da inserire nei sorgenti veri e propri, .c/.cc/.cpp).

Il problema della ridefinizione si verifica dal momento che il metodo A::makeAThing() lo definisci in entrambi i files (perche` con l`#include includi interamente m1.cpp in prog.cpp).

Quindi:

1) Compili prog.cpp -> definizione A::makeAThing() (incluso in m1.cpp)
2) Compili m1.cpp -> definizione A::makeAThing()

Il linker unisce gli output e si chiede quale sia la definizione giusta fra le due, ma non lo sa e quindi compare l`errore.

La soluzione e` questa:

codice:
// m1.hpp (dichiarazione della classe)
class A
{
    public:
        makeAThing();
};

// m1.cpp (implementazione della classe)
A::makeAthing()
{
}

// prog.cpp
#include "m1.hpp"

int main()
{
    A a;
    a.makeAThing();
}
Un`altra soluzione sarebbe definire il metodo 'inline' nella dichiarazione di classe, ma per adesso non penso possa interessarti.

Se non hai capito rispondi qui.

Ciao.