C++如何隐藏类内enum使其无法从Main.cpp访问仅成员函数可用
报错原因说明
你之前尝试把enum移到private段报错,是因为你的公开成员函数set_a_thing()的返回值类型是这个私有enum,编译器会判定外部代码可能需要接收这个返回值,但私有类型对外部不可见,所以会抛出标识符找不到的错误。
解决方案1:完全隐藏enum(推荐符合你的需求)
如果你不需要外部接收set_a_thing()的返回值,直接修改公开函数的返回类型,再把enum移到私有段即可,此时Main.cpp完全感知不到该enum的存在,只有类内部成员可以访问:
修改后的头文件
#ifndef MY_CLASS_H_ #define MY_CLASS_H_ class MyClass { public: MyClass(); ~MyClass(); // 返回值改为void,不需要对外暴露enum类型 void set_a_thing(); private: // enum移到私有段,外部完全无法访问 enum A_few_Things { yes, no, sometimes, dont_know }; A_few_Things a_few_things = A_few_Things::dont_know; }; #endif // !MY_CLASS_H_
修改后的cpp实现
#include "MyHeader.h" MyClass::MyClass() { } MyClass::~MyClass() { } void MyClass::set_a_thing() { // 类内部依然可以正常使用所有enum枚举值 a_few_things = A_few_Things::yes; }
解决方案2:需要返回状态但不暴露enum定义
如果业务需要set_a_thing()对外返回状态值,你可以把返回值替换为int这类基础类型,内部用enum做映射,依然把enum放在私有段:
头文件修改
// 公开函数返回int类型,外部只知道拿到状态码,不知道内部enum实现 int set_a_thing();
cpp实现修改
int MyClass::set_a_thing() { a_few_things = A_few_Things::yes; // 把enum值转成整数返回即可 return static_cast<int>(a_few_things); }
补充说明
如果你本来就需要外部代码能拿到set_a_thing()返回的枚举状态,那这个enum必须对外公开,没有办法既让外部能用返回的枚举值、又完全隐藏enum的定义,这种场景下你不需要做额外调整,把enum放在public段是合理的写法。
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

