2013-08-01 16 views
1
#include<iostream> 
using namespace std; 

class sample { 
    public: 
     static int x; 
}; 

//int sample::x = 20; 

int main() { 
    sample s1; 
    int sample::x = 30; 
} 

当我编译那么这个程序得到了一个错误无效使用合格的名称“样本:: X”C++,错误:无效使用合格的名称

我知道,我得到这个由于此声明导致的错误int sample :: x = 30;主要是

但我不明白,为什么我不能定义int sample :: x = 30;在主?

+0

为什么你想初始化主类的静态atributte,而不是类的.cpp,或者只是在.H的theglobal范围类定义后? – Manu343726

+0

@ Manu343726我只是想清除我的概念! –

+1

有没有理由生气,我只是做了一个问题,因为我不明白你想要做什么 – Manu343726

回答

5

作为标准说:

The definition for a static data member shall appear in a namespace scope enclosing the member’s class definition.

此外,静态数据成员的定义在类的范围。 所以,

int x = 100; //global variable 

class StaticMemeberScope 
{ 
    static int x; 
    static int y; 
}; 

int StaticMemeberScope::x =1; 

int StaticMemeberScope::y = x + 1; // y =2 (StaticMemeberScope::x, not ::x) 
+0

请格式化你的帖子:)它的不可读 – Manu343726

+1

@ Manu343726那么它是如何得到一个紫外线 – aaronman

+1

它是我的:)我只是eddited格式 – Manu343726

3

你必须在全局命名空间

#include<iostream> 

class sample { 
    public: 
     static int x; 
}; 

int sample::x = 20; 

int main() { 
    sample s1; 
    sample::x = 30; 
} 

为其分配空间,您可以在n设置它通常在主或任何其他方法。这是关于静态关键字的tutorial。我删除了使用指令,因为引入整个名称空间是不好的做法,特别是当你不需要它时。

静态瓦尔需要初始化的原因是全球范围内是因为静态和全局变量有静态存储时间

+0

你不应该建议任何人使用'使用名称空间标准;'。我会从复制的样本中删除这部分。 –

+0

@ g-makulik固定它 – aaronman

1

静态成员像全局对象只能通过sample::x

您访问在定义类的全局范围内初始化它们。

所以你不能初始化main,这是一个语法错误。

1

你不能定义一个函数内的静态变量,但必须这样做,任何范围之外: 尝试

int sample::x = 30; 

int main() { 
    sample s1; 
} 

代替。 你可以做,虽然:

int sample::x = 30; 

int main() { 
    sample s1; 

    sample::x = 42; // Note the different syntax! 
}