使用嵌套类函数时非静态数据成员的使用无效,但函数未嵌套时可以吗?
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
相关,因此它不会知道您在说什么interface
或registerTable
。
我会考虑将this 作为解决您问题的方法。
【讨论】:
好的。那么,放弃实现点符号以提高可读性并增加使用引用的复杂性(根据解决方法)是更好的做法吗?与在一个级别上拥有许多函数且名称冗长且不需要使用引用相比? 我宁愿选择“解决方法”,我什至会为“system_r”创建一个抽象的独立类和一个具体的派生类,以便更容易测试和扩展你的课程en.wikipedia.org/wiki/Dependency_injection以上是关于使用嵌套类函数时非静态数据成员的使用无效,但函数未嵌套时可以吗?的主要内容,如果未能解决你的问题,请参考以下文章