C++如何解决类内使用本类全局常量的循环定义问题
解决方案1:拆分声明与实现,利用extern前向声明常量
你遇到的是C++的名称查找顺序和类型完整性要求的冲突,可通过拆分成员函数的声明和实现解决,同时修复你代码里的内存泄漏问题(*new的写法会导致动态分配的对象永远无法释放,直接用栈常量即可):
// 1. 前向声明Color类 class Color; // 2. 前向声明全局常量,告诉编译器这两个常量存在,定义放到后面 extern const Color BLACK; extern const Color WHITE; // 3. 定义Color类,成员函数只写声明,不写实现 class Color { public: Color(int r, int g, int b): r(r), g(g), b(b) {} // 成员函数仅声明 Color CloserBlackOrWhite(); private: const int r; const int g; const int b; }; // 4. 定义常量,此时Color类是完整类型,可以正常构造 const Color BLACK(0, 0, 0); const Color WHITE(255, 255, 255); // 5. 最后实现成员函数,此时BLACK和WHITE都已经声明,可正常引用 Color Color::CloserBlackOrWhite() { int rgb = r + g + b; return rgb > (255*3/2) ? BLACK : WHITE; }
解决方案2:将常量设为类的静态成员(更推荐)
黑白颜色常量本身属于Color类的专属属性,放到类内作为静态成员更符合封装要求,也不需要全局作用域的额外声明:
class Color { public: Color(int r, int g, int b): r(r), g(g), b(b) {} Color CloserBlackOrWhite() { int rgb = r + g + b; return rgb > (255*3/2) ? BLACK : WHITE; } // 声明静态常量 static const Color BLACK; static const Color WHITE; private: const int r; const int g; const int b; }; // 类外定义静态常量 const Color Color::BLACK(0, 0, 0); const Color Color::WHITE(255, 255, 255);
额外注意点
你原始代码中Color的构造函数默认是private权限,外部无法调用构造常量,需要把构造函数改为public权限才能正常初始化常量。
内容的提问来源于stack exchange,提问作者Coding Mason
相关产品推荐
相关产品推荐

