使用嵌套类函数时非静态数据成员的使用无效,但函数未嵌套时可以吗?

Posted

技术标签:

【中文标题】使用嵌套类函数时非静态数据成员的使用无效,但函数未嵌套时可以吗?【英文标题】:Invalid use of non-static data member when nested class function is used, but OK when the function is not-nested? 【发布时间】:2018-04-25 21:07:38 【问题描述】:

我正在尝试使用“ChargerClass::SystemStruct::initNested()”操作“registerTable”,并使用在初始化“接口”期间传入的对象中的函数。

我想嵌套的原因是启用点符号来使用类成员;这个类中会有很多函数,点符号会清楚地说明正在使用类的哪一部分。

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

如果 initNested() 在“SystemStruct”内,我会收到编译器错误:

非静态数据成员“ChargerClass::interface”的使用无效 非静态数据成员“ChargerClass::registerTable”的使用无效

但是,如果 initNOTNested() 在父类 ChargerClass 中并且没有嵌套在 SystemStruct 中。它编译得很好。

我在代码 sn-p 中包含了 initNested() 和 initNOTNested() 的 cmets;

我使用的是 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】:

您可能误解了什么是嵌套类。 嵌套类是具有特殊访问权限的独立类。这意味着定义system_r 的实例无论如何都不会与ChargerClass 相关,因此它不会知道您在说什么interfaceregisterTable。 我会考虑将this 作为解决您问题的方法。

【讨论】:

好的。那么,放弃实现点符号以提高可读性并增加使用引用的复杂性(根据解决方法)是更好的做法吗?与在一个级别上拥有许多函数且名称冗长且不需要使用引用相比? 我宁愿选择“解决方法”,我什至会为“system_r”创建一个抽象的独立类和一个具体的派生类,以便更容易测试和扩展你的课程en.wikipedia.org/wiki/Dependency_injection

以上是关于使用嵌套类函数时非静态数据成员的使用无效,但函数未嵌套时可以吗?的主要内容,如果未能解决你的问题,请参考以下文章

访问父类的成员“非静态数据成员的使用无效”C++

使用boost bind时无效使用非静态成员函数 - c ++

Linux - 信号:错误:非静态成员函数的使用无效

回调问题错误:非静态数据成员的使用无效

Kotlin学习3-类(嵌套/内部类,数据/静态类)

在 .cpp 文件中使用类的静态成员