在类自身内部创建类的静态实例的正确方法
Proper way to create static instance of a class inside of itself
我有一个像素结构。我想在里面贴花静态常数的颜色,如黑色和白色。我正在将所有内容写入一个头文件中,该头文件将包含在多个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文件)中相同命名变量的其他实例发生冲突。
相关文章:
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 初始化指向类实例的智能指针并访问其方法
- 如何在没有实例的情况下获取非静态方法的类型?
- 使用动态实例化的对象填充矢量的快速方法
- 检查类是否在方法中实例化
- 所有类实例方法的打印语句最后都在打印吗?
- 当对象为值时访问实例方法<map>
- CPU寄存器中返回的用户定义类型的C 对象.实例方法如何工作
- 是否可以在实例方法中使用带有"this"的重载运算符?
- 如何使用带有实例方法的C++11线程
- 将 boost::function 与实例方法一起使用
- 在 Visual Studio 2008 C++ Express 中评估实例方法
- 如何通过禁用名称篡改来PInvoke实例方法
- 将C++实例方法与C回调函数混合使用
- 在同一个c#或c++类中可以有静态方法和实例方法吗?
- 使用随机数生成器:多实例或单实例方法
- 对象切片,不需要额外的实例方法和变量
- 为什么子类的非重写实例方法中的"this"类型是父类型?
- 子类调用基类构造函数,然后使用子类Arduino c++中基类的实例方法