使用嵌套类函数时无效使用非静态数据成员,但是当函数未嵌套时可以正常使用?

时间:2018-04-25 21:07:38

标签: c++ class nested access member

我试图用'ChargerClass :: SystemStruct :: initNested()'来操作'registerTable',并使用在初始化'界面'期间传入的对象的函数。

我想嵌套的原因是允许使用点表示法来使用Class成员;这个类中会有很多函数,点符号会清楚表明该类的哪个部分正在被利用。

'chargerHAL_r hal'必须传入,因为它是一个抽象层对象,允许多个通信协议与ChargerClass一起使用。

如果initNested()在'SystemStruct'中,我会遇到编译器错误:

  • 无效使用非静态数据成员'ChargerClass :: interface'
  • 无效使用非静态数据成员'ChargerClass :: registerTable'

但是,如果initNOTNested()在父类ChargerClass中而不是嵌套在SystemStruct中。它编译得很好。

我在initNested()和initNOTNested()的代码片段中包含了注释;

我使用的是C ++ 11,从这个版本开始,对封闭类成员的嵌套类访问是有效的,没有?

我错过了什么?

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 :(得分:1)

您可能误解了嵌套类的含义 嵌套类是具有特殊访问权限的独立类。这意味着定义system_r的实例与ChargerClass无关,因此它不会知道您正在谈论的interfaceregisterTable
我会将this视为您问题的解决方法。