En C ++, ¿cómo puedo evitar #incluir un archivo de encabezado cuando necesito usar una enumeración?

En mis archivos de encabezado de C ++, trato de usar declaraciones directas (clase MyClass;) en lugar de #incluir el encabezado de clase, como se recomienda en muchos estándares de codificación de C ++ (la Guía de estilo de Google C ++ es una).

Desafortunadamente, cuando presento enumeraciones, ya no puedo hacer la declaración directa. Me gusta esto

//// myclass1.hpp ////

class MyClass1
{
    enum MyEnum1
    {
        Enum_A, Enum_B, Enum_C
    };
};

//// myclass2.hpp ////

// I want to avoid this
#include "myclass1.hpp"

// I'd prefer to do this (forward declaration)
class MyClass1;

class MyClass2
{
    // This is o.k.: I only need to forward declare MyClass1
    MyClass1* ptr;

    // This forces me to #include, but I don't want to!
    void func( MyClass1::MyEnum1 e );
};

La mejor solución que se me ocurre hasta ahora es reemplazar las enumeraciones con constantes de miembros:

//// myclass1.hpp  ////

MyClass1
{
    static const int Enum_A;
    static const int Enum_B;
    static const int Enum_C;
};

//// myclass1.cpp ////

const int Enum_A = 1;
const int Enum_B = 2;
const int Enum_C = 3;

En este caso, sin embargo, la solución parece peor que el problema.

Actualmente estoy mirando a través deLarge Scale C ++ Software Design (Lakos) yTrabajando eficazmente con código heredado (Plumas) para las técnicas de ruptura de dependencia, pero aún no he encontrado una buena solución.