Предописание вложенного перечисления

У меня есть код, подобный следующему:

class B
{
}

class A
{
  enum {
     EOne,
     ETwo
  } EMyEnum;

  B myB;
}

Я хочу объявить члена типа EMyEnum в классе B (который объявляется прежде A). Действительно ли это возможно? Я понимаю, что решение состоит в том, чтобы объявить второй класс B, но для ясности я предпочел бы не.

16
задан JasonMArcher 7 June 2015 в 01:28
поделиться

3 ответа

Это невозможно... но это можно подделать с помощью злоупотребления наследованием :)

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;
};

С другой стороны... почему бы вам просто не объявить 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 };

Конечно, вам нужно написать все обычно "генерируемые по умолчанию" методы A, но это стоит не так дорого!

11
ответ дан 30 November 2019 в 23:00
поделиться

Текущий стандарт C ++ не допускает форвардных объявлений enum s, хотя они появятся в грядущем стандарте C ++ 0x .

См. здесь для получения дополнительной информации.

2
ответ дан 30 November 2019 в 23:00
поделиться

Вы можете объявить A параметром шаблона B. Второй способ его решения - использовать int - известно, что c++ enum - это int.

0
ответ дан 30 November 2019 в 23:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: