dichiarazione anticipata di enum nidificato
-
19-09-2019 - |
Domanda
Ho codice simile al seguente:
class B
{
}
class A
{
enum {
EOne,
ETwo
} EMyEnum;
B myB;
}
Voglio dichiarare un membro di tipo EMyEnum in classe B (che è dichiarato prima di A). È possibile? Mi rendo conto che la soluzione è quella di dichiarare di classe B secondo, ma per chiarezza io preferirei non.
Soluzione
Non è possibile ... ma può essere simulato con l'abuso di successione:)
namespace detail
{
class A_EMyEnum
{
public:
enum {
EOne,
ETwo
} EMyEnum;
protected:
A_EMyEnum() {}
A_EMyEnum(const A_EMyEnum&) {}
A_EMyEnum& operator=(const A_EMyEnum&) { return *this; }
~A_EMyEnum() {}
}; // class A_EMyEnum
} // namespace detail
class B { // use detail::A_EMyEnum };
class A: public detail::A_EMyEnum
{
B mB;
};
D'altra parte ... perché non è sufficiente dichiarare avanti B?
class B;
class A
{
public:
enum EMyEnum {};
A();
A(const A&);
A& operator=(const A&);
~A();
void swap(A&);
private:
B* mB;
};
class B { // use A::EMyEnum };
Certo è necessario scrivere in realtà "ha generato default" metodi di A tutto il solito, ma hey che non costa tanto!
Altri suggerimenti
L'attuale standard di C ++ non consente in avanti dichiarazioni di enum
s, anche se arriveranno nel prossimo standard di C ++ 0x.
qui per ulteriori informazioni.
È possibile dichiarare un parametro come modello di B. Secondo modo per risolverlo sta usando Int. - è noto che c ++ enum è int