Отделение перечислений от определений классов с использованием пространств имен в C ++? - PullRequest
0 голосов
/ 16 ноября 2009

Я работаю с унаследованным классом, который выглядит следующим образом:

class A
{
    enum Flags { One = 1, Two = 2 };
};

Я хотел бы вытащить все перечисления в новое пространство имен, определенное в новом заголовке:

// flags.h

namespace flags {

enum Flags { One = 1, Two = 2 };

};

Затем перетащите эти перечисления обратно в класс, чтобы я мог включить только заголовки flags.h в заголовки, которым требуются только эти значения (а не полное определение класса):

// a.h

#include "flags.h"

class A
{
    using namespace flags;
};

Как мне это сделать?

Ответы [ 3 ]

2 голосов
/ 16 ноября 2009

Использование директивы недопустимо в области видимости класса. Вместо пространства имен вы можете определить класс, а затем наследовать от него:

struct flags {
    enum Flags { One=1, Two=2 };
};

class A : public flags { ... };

Но, честно говоря, для меня это выглядит как злоупотребление наследством. В качестве альтернативы вы можете укусить пулю и использовать пространство имен без «импорта» имен в класс A.

1 голос
/ 16 ноября 2009

Вы не можете сделать их видимыми в классе, не извлекая значения отдельно через using объявления.

Лучшее, на мой взгляд, что вы можете сделать - это обернуть их в класс, который больше ничего не содержит. Таким образом, вы можете сделать их видимыми в другом классе, выведя из класса, который содержит перечисления:

struct Holder {
   enum E { a };
protected:
   Holder() {}
   ~Holder() {}
};

class User : public Holder 
{
public:
   void f() { /* a is visible here */ }
};

void f() { /* User::a is visible here */ }
0 голосов
/ 16 ноября 2009
class F {
  enum Flags { One = 1, Two = 2 };
};


class A : public F {
};
...