You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用现代优雅的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:18:49