C++枚举类构造函数初始化问题:不知如何传递枚举参数
解决CPerson构造函数的枚举参数问题
你的核心问题在于私有嵌套枚举类Gender的访问方式,以及enum class的正确引用语法。咱们一步步来梳理解决:
1. 先修正枚举的访问权限(最关键)
你把Gender定义成了CPerson的私有成员,这意味着哪怕是类内部的成员函数能访问,一旦要在类外部创建CPerson对象就完全用不了。更合理的做法是把Gender移到public区域,让外部代码能正常传递枚举值:
class CPerson { private: char* Name; public: // 将Gender设为公有,外部才能访问 enum class Gender { Male = 0, Female = 1 }; Gender sex; // 构造函数逻辑不变 };
2. 正确传递枚举值
因为Gender是强类型的enum class,必须通过作用域解析符来引用枚举值,不能直接写Male或Female。所以构造函数的调用应该写成这样:
// 注意:main必须是全局函数,不能作为CPerson的成员函数! int main() { // 传入男性枚举值 CPerson person("Simon", CPerson::Gender::Male); // 如果要传入女性,就写CPerson::Gender::Female return 0; }
3. 顺带修正代码里的其他小问题
- 你把程序入口
main写成了CPerson的成员函数,这是C++的语法错误!main必须是全局函数,不能属于任何类。 - 代码里的
Cperson是拼写错误,C++大小写敏感,应该写成CPerson。 - 你的类没有析构函数,会导致
Name指向的堆内存泄漏,建议补充:
~CPerson() { delete[] Name; }
完整修正后的代码示例
#include <cstring> // 别忘了包含strlen和strcpy的头文件 class CPerson { private: char* Name; public: enum class Gender { Male = 0, Female = 1 }; Gender sex; CPerson(const char* szName, Gender s) : Name{ nullptr } { Name = new char[strlen(szName) + 1]; strcpy(Name, szName); sex = s; } // 析构函数释放堆内存 ~CPerson() { delete[] Name; } }; int main() { CPerson simon("Simon", CPerson::Gender::Male); return 0; }
内容的提问来源于stack exchange,提问作者Belin
相关产品推荐
相关产品推荐

