Единственное, что я хотел бы прокомментировать с помощью кодов ошибок для каждого класса, это то, что вы не сможете написать один регистратор ошибок (или, по крайней мере, нелегко) из-за того, что один и тот же код будет означать разные вещи в зависимости от класса.
Тем не менее, вы всегда можете использовать оба. Иметь глобальное перечисление с типичными ошибками:
enum GlobalErrors {
EOk = 0,
EErrOutOfMemory,
// etc.
EFreeErrorCodeBase
};
и затем в классах вы можете иметь:
class Something {
enum ClassErrors {
EErrCantInitialize = EFreeErrorCodeBase,
EErrCorruptedData,
// etc.
};
...
};
Что дает вам место для глобальных кодов ошибок и гарантирует, что коды ошибок вашего класса не будут перекрывать глобальные (и это поддерживается компилятором).