我试图从MyClass.cpp到达MyClass.h中声明的静态变量。但我得到以下错误。 我做了一个研究,但仍然不知道为什么我的代码不编译。我使用visual studio 2013。
#ifndef __MyClass_h_
#define __MyClass_h_
class MyClass {
static int x;
public:
static int y;
};
#endif
#include "MyClass.h"
void MyClass::sor() (const string& var1, const unsigned count) const {
// What goes here? See below for what I have tried
}
所以,如果我使用:
int MyClass::x=8;
这表示int MyClass::x redefinition
和MyClass::x 'MyClass::x' : definition or redeclaration illegal in current scope
如果我使用:
MyClass::x=8;
这会产生错误1 unresolved external
。
如果我使用:
MyClass::y=8;
这也会出现错误1 unresolved external
。
如果我使用:
int MyClass::y=8;
这表示int MyClass::y redefinition
和'MyClass::y' : definition or redeclaration illegal in current scope
答案 0 :(得分:1)
您需要了解自己在标题中没有静态变量,其他答案如何建议。你有一个类的静态成员,这非常好。
要访问它,请编写:MyClass::x
。您还需要初始化它。
与静态成员无关,您还需要声明该方法:
头:
#ifndef __MyClass_h_
#define __MyClass_h_
class MyClass {
static int x;
public:
static int y;
void sor() (const string& var1, const unsigned count) const;
};
#endif
源文件:
#include "MyClass.h"
int MyClass::x = 0; // intialization
void MyClass::sor() (const string& var1, const unsigned count) const {
MyClaxx::x = 11; // access it
}
答案 1 :(得分:0)
您对静态变量有声明,但没有定义。要使用静态类成员,您应该在相应的翻译单元中定义它们。您不能在头文件中执行此操作,因为它将违反ODR(一个定义规则),因此您应该在.cpp文件中定义它以克服上述规则。
因此,您必须将int MyClass::x = 0;
放在全局范围内的cpp文件中(如果有的话,放在命名空间下)以使其正常工作。请注意,您可以使用0
所提供的任何值,或者甚至不提供任何值(在这种情况下,由于对全局(静态)变量的特殊处理,它将为0)。
答案 2 :(得分:-1)
在头文件中声明静态变量时,其范围仅限于.h文件或所有单位。
答案 3 :(得分:-1)
这很简单。当您在头文件中declare a static variable
时,它的范围仅限于头文件。当您要在static variable
文件中使用.cpp
时,您会得到error
这样的内容。这是因为你没有给出静态变量的definition
。因此,在任何.cpp
文件中,您需要提供static
变量的定义。例如:
.h文件
class MyClass {
static int x;
.....
}
.cpp文件的顶部你应该像这样定义静态变量。
#include "MyClass.h"
int MyClass::x = 0 ;
void MyClass::sor() (const string& var1, const unsigned count) const {
MyClass::x = 8 ; // you can access without any issue
}