初始化静态成员时出现重新声明错误

时间:2015-08-04 03:34:17

标签: c++ class static-members

我创建了一个类,其中有一些静态成员。

我用Google搜索"如何初始化静态成员",并且我了解到我应该在类外部初始化静态成员。

但是,我在初始化静态成员时遇到了重新声明错误。

我做错了什么?

#include <stdio.h>
#include <conio.h>
#include <iostream.h>

using namespace std;
class Color
{
public:
int r,g,b;
Color();
Color(int r_,int g_,int b_)
{
r=r_;
g=g_;
b=g_;
}
static Color Red;
};

int main()
{
Color Color::Red=Color(255,0,0);
return 0;
}

2 个答案:

答案 0 :(得分:3)

尝试将其移出main()

...
Color Color::Red = Color(255, 0, 0);
int main() 
{
...

答案 1 :(得分:2)

您应该像这样初始化您的静态成员。

class class_name {
    static int i;
};
int class_name::i = 0;

这是必需的,因为你的类只能有一个i实例。 但是对于常量变量,您可以直接在您的班级中执行此操作。

class class_name {
    static int i;
    const static int j = 20;

};

修改: 该标准的第6.7节有这样的说法:

  

使用静态存储的所有本地对象的零初始化   持续时间在任何其他初始化发生之前执行。一个   具有静态存储持续时间的POD类型的本地对象   在第一次输入块之前初始化常量表达式。   允许实现执行早期初始化   其他具有静态存储持续时间的本地对象   静态允许实现的条件   在命名空间范围内使用静态存储持续时间初始化对象。   否则,在第一次控制通过时初始化这样的对象   通过宣言;这样的对象被认为是初始化的   完成初始化。如果初始化退出   抛出异常,初始化不完整,所以会   下次控制进入声明时再试一次。如果   控件在对象出现时重新输入声明(递归)   在被初始化时,行为是不确定的。