Możesz dorobić statycznego inta first_free_id = 0, a następnie używać go i inkrementować w konstruktorze kolejnych obiektów. Zwróć uwagę na konstruktor kopiujący i operator przypisania, bo domyślne prawdopodobnie nie będą działać tak jak byś tego chciał.
struct ObjectWithId
{
static int first_free_id;
int id;
ObjectWithId():
id(first_free_id++)
{
}
};
int ObjectWithId::first_free_id = 0;