如何用现代优雅的C++方式设计带预定义标准颜色的Colour类?
嘿,这事儿超简单!用现代C++的constexpr静态成员就能完美实现你要的预定义颜色调用方式,既优雅又高效,还完全兼容你现有的基础类用法。给你个最小实现示例:
带预定义标准颜色的Colour类
class Colour { public: // 保留你原有的数组成员,也可以换成std::array(更安全适配STL) double rgb[3]; // 构造函数,兼容你原来的初始化写法 constexpr Colour(double r, double g, double b) : rgb{r, g, b} {} // 预定义颜色:用constexpr inline静态成员(C++17及以上支持,编译期完成初始化) static constexpr Colour Red{1.0, 0.0, 0.0}; static constexpr Colour Yellow{1.0, 1.0, 0.0}; static constexpr Colour Green{0.0, 1.0, 0.0}; static constexpr Colour Blue{0.0, 0.0, 1.0}; static constexpr Colour White{1.0, 1.0, 1.0}; static constexpr Colour Black{0.0, 0.0, 0.0}; }; // 如果你用的是C++17之前的版本,需要在类外补充定义这些静态成员: // constexpr Colour Colour::Red{1.0, 0.0, 0.0}; // constexpr Colour Colour::Yellow{1.0, 1.0, 0.0}; // ... 其他颜色同理
使用示例
完全符合你的预期,新旧用法都支持:
#include <iostream> int main() { // 你原来的初始化方式依然有效 Colour c1 = {1.0, 0.0, 0.0}; // 新的预定义颜色调用方式,简洁直观 Colour c2 = Colour::Red; Colour c3 = Colour::Yellow; // 测试输出 std::cout << "Yellow RGB: " << c3.rgb[0] << ", " << c3.rgb[1] << ", " << c3.rgb[2] << std::endl; return 0; }
设计说明
- constexpr:让预定义颜色在编译期就完成初始化,运行时无额外开销,还能在编译期上下文(比如模板参数)中使用。
- 静态成员:属于类本身,无需实例化就能直接调用,完美匹配
Colour::Red的语法需求。 - 兼容性:构造函数的设计完全兼容你原来的初始化写法,旧代码不用做任何修改。
要是想更贴合现代C++最佳实践,把double rgb[3]换成std::array<double, 3>会更好——它支持范围for循环、边界检查(at()方法),还能和STL算法无缝配合,性能和原始数组一致,但安全性和易用性提升不少。
内容的提问来源于stack exchange,提问作者user62039
相关产品推荐
相关产品推荐

