Могу ли я назначить перечисление класса на основе закрытого / защищенного члена? - PullRequest
4 голосов
/ 25 сентября 2019

У меня есть класс, и мне нужно сделать размер одного из его защищенных элементов общедоступным.

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

class MyObject
{
  public:
    enum
    {
        myFieldSize = sizeof(myField),
    };
  protected:
    uint8_t myField;
}

Однако мой компилятор говорит мне, что он не может найти объявление для "myField".Это ожидаемое поведение?У меня есть другие общедоступные функции, которые обращаются к myField, почему перечисление, по-видимому, не может это сделать?

Ответы [ 2 ]

5 голосов
/ 25 сентября 2019

Это один из тех случаев, когда порядок того, что у вас есть в вашем классе, имеет значение: myField не существует в точке, достигнутой sizeof(myField).

Обходной путь должен иметь uint8_t myField;выше enum.

4 голосов
/ 25 сентября 2019

Имя myField не объявляется, когда оно используется в объявлении перечисления.Обменяйте объявления членов данных как

class MyObject
{
  protected:
    uint8_t myField;
  public:
    enum
    {
        myFieldSize = sizeof(myField),
    };
};
...