Неправильное использование нестатического члена данных, когда используется вложенная функция класса, но нормально, когда функция не является вложенной? - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь манипулировать «registerTable» с помощью «ChargerClass :: SystemStruct :: initNested ()» с помощью функции из объекта, переданного во время инициализации «interface».

Причина, по которой я хочу вложитьдолжен разрешить использование точечной нотации для использования членов класса;в этом классе будет много функций, и точечная нотация прояснит, какая часть класса используется.

'chargerHAL_r hal' должен быть передан, так как это объект уровня абстракции, допускающий несколькопротоколы связи, которые будут использоваться с ChargerClass.

Если initNested () находится внутри 'SystemStruct', я получаю ошибки компилятора:

  • недопустимое использование элемента нестатических данных 'ChargerClass:: interface '
  • недопустимое использование элемента нестатических данных' ChargerClass :: registerTable '

Однако, если initNOTNested () находится в родительском классе ChargerClass и не вложен в SystemStruct.он прекрасно компилируется.

Я включил комментарии во фрагмент кода как для initNested (), так и для initNOTNested ();

Я использую C ++ 11, и начиная с этой версии, nested-Доступ класса к членам вмещающего класса действителен, нет?

Что мне не хватает?

struct chargerHAL_r {
    static void readAllRegisters(uint8_t *regTable);
};


class ChargerClass {
public:
    ChargerClass(chargerConfig_r config, chargerHAL_r hal) {
        interface = hal;
    }


    struct system_r {
        bool initNested(); /* Compiler throws error */
    };

    bool initNotNested(); /* Compiles OK */


private:
    uint8_t registerTable[20];
    chargerHAL_r interface;
};


/* Compiler throws error */
bool ChargerClass::system_r::initNested() {
    interface.readAllRegisters(registerTable);
}

/* Compiles OK */
bool ChargerClass::initNotNested() {
    interface.readAllRegisters(registerTable);
}

1 Ответ

0 голосов
/ 26 апреля 2018

Возможно, вы неправильно поняли, что такое вложенный класс.
Вложенный класс - это независимый класс со специальными привилегиями доступа.Это означает, что определение экземпляра system_r в любом случае не будет связано с ChargerClass, следовательно, он не будет знать, о чем interface или registerTable вы говорите.
Я бы рассмотрел this как обходной путь для вашей проблемы.

...