在类自身内部创建类的静态实例的正确方法

Proper way to create static instance of a class inside of itself

本文关键字:实例 方法 静态 创建 内部      更新时间:2023-10-16

我有一个像素结构。我想在里面贴花静态常数的颜色,如黑色和白色。我正在将所有内容写入一个头文件中,该头文件将包含在多个cpp文件中。

struct Pixel
{
    typedef uint16_t quantum_t; 
    static const quantum_t MAX_QUANTUM = 0xffffL;
    static const quantum_t MIN_QUANTUM = 0;
    static const int QUANTUM_BITS = 16;
    quantum_t r, g, b;
    Pixel(quantum_t r_ = 0, quantum_t g_ = 0, quantum_t b_ = 0) :
        r(r_), g(g_), b(b_) { }
    template<typename T>
    static T clamp(T x)
    {
        return x > MAX_QUANTUM ? MAX_QUANTUM : (x < MIN_QUANTUM ? MIN_QUANTUM : x);
    }
    template<typename T>
    static Pixel clamp(T r, T g, T b)
    {
        return Pixel(clamp(r), clamp(g), clamp(b));
    }
    static const Pixel BLACK;
    static const Pixel WHITE;
};
const Pixel Pixel::BLACK(0, 0, 0);
const Pixel Pixel::WHITE(Pixel::MAX_QUANTUM, Pixel::MAX_QUANTUM, Pixel::MAX_QUANTUM);

起初,我试图初始化结构内部的静态BLACK和WHITE,但我从g++中得到了一个关于类型不完整的错误。一旦我在结构之外声明了静态变量,错误就消失了,代码现在可以编译了。这是一个只有头的库,我想知道的是,如果它包含在多个cpp文件中,那么像这样声明静态变量会导致编译问题吗?

像这样声明静态变量会导致编译问题吗如果它包含在多个cpp文件中?

不,因为C++标准允许这种特殊的用法,并且除非它们被声明为extern,否则它们将不会被看到或与其他翻译单元(即cpp文件)中相同命名变量的其他实例发生冲突。