在类内部和外部分配静态常量,为什么有区别



这太神奇了,我正在用C++编写一个像素操作库。所以我想有一个充满色彩预设的类。Color是一个具有如下结构的类:

Color(int r, int g, int b, int a)

如果我在任何类之外声明它为:

static const Color COL_BLACK = Color(0, 0, 0, 255);

这表明Visual Studio代码中没有错误。但是,当我这样构建时:

class Colors {
public:
static const Color Black = Color(0, 0, 0, 255);
};

等号下面有一条红色的歪歪扭扭的线,但当我把鼠标悬停在上面时,它不会告诉我出了什么问题。怎么了?

注意,我希望它被这样调用:

Color newCol = Colors::Black;

由于C++17,您可以简单地使用inline,如下所示:

#include <iostream>
class Color
{
public:
Color(int r, int g, int b, int a)
: 
r{ r },
g{ g },
b{ b },
a{ a }
{
}
int r, g, b, a;
};
class Colors 
{
public:
inline static const Color Black = Color(0, 0, 0, 255);
};
int main()
{
Color c = Colors::Black;
std::cout << c.r << "," << c.g << "," << c.b << "," << c.a << "n";
}

阅读一些关于静态初始化的内容。同时,在这种情况下,您可以用constexprctor定义Color,如下所示:

struct Color
{
const unsigned int r;
const unsigned int g;
const unsigned int b;
const unsigned int a;
constexpr Color( const unsigned int r, const unsigned int g, const unsigned int b, const unsigned int a ) : r(r), g(g), b(b), a(a)
{}
};

然后你可以像这样初始化Colors

class Colors
{
public:
static constexpr Color Black = Color(0, 0, 0, 255);
};

最新更新