3

我试图使用以下代码:

class Test 
{
private:
    static int x;
public:
    Test(int i) : x(i) {}
};
main()
{
    Test a(5);
}

但是,然后我得到了错误:

‘int Test::x’ is a static data member; it can only be initialized at its definition

上述实现有什么问题?

4

3 回答 3

4

错误消息非常准确地告诉您问题。

问题是静态成员只有一个实例,而不管您碰巧创建了多少类实例。即使您创建了该类的多个实例,您也只需对其进行一次初始化——这意味着它不能附加到构造函数。

class Test 
{
private:
    static int x;
public:

};

int Test::x = 1; // newly added

main()
{
    Test a;
}

在这种情况下,看起来您可能根本不想要一个静态成员变量——您在创建类的实例时传递了一个值来初始化它,这往往表明您可能只想要一个普通的成员变量:

class Test 
{
private:
    int x;
public:
    Test(int i) : x(i) {}
};

main()
{
    Test a(5);
}

在这种情况下,如果您想要具有不同值的对象的第二个实例,您可以这样做:

main() { 
    Test a(5), b(1);
}
于 2013-03-20T04:17:15.797 回答
3

静态变量不是对象的一部分——它们是类的一部分。这就是为什么您不能将它们与对象的其他成员一起初始化的原因。

您需要在源文件的某处提供静态变量的定义,并且可以将其初始化放在那里:

int Test::x = 5;
于 2013-03-20T04:15:08.850 回答
1

类静态变量必须在类主体之外进行存储,并且可以进行初始化。像这样:

class Test 
{
private:
    static int x;
public:
    Test(int i) { x = i; }
};
int Test::x = 42;

main()
{
    Test a(5);
}
于 2013-03-20T04:16:43.477 回答