静态成员变量的有关问题,int Data:a=10为什么非得在.cpp中初始化,能不能用extern解决这个有关问题
静态成员变量的问题,int Data::a=10为什么非得在.cpp中初始化,能不能用extern解决这个问题啊
//Data.h
class Data
{
public:
static int GetData();
static void IcrData();
static void SetData(int);
private:
static int a;
};
//Data.cpp
int Data::a=10;//这句移到Data.h文件中,程序就编译不过去,
int Data::GetData()
{
return a;
}
void Data::IcrData()
{
a++;
}
void Data::SetData(int i)
{
a=i;
}
int main()
{
return 0;
}
------解决方案--------------------
因为在h文件中其他文件也存在了int Data::a=10;这一句,所以就会冲突.
------解决方案--------------------
一般情况下 静态成员的初始化应放在cpp中 而不是h中
因为h可能被多个cpp包含(#include),这种情况下 如果是在h中初始化静态成员的 就会造成编译期间的“重定义”错误
------解决方案--------------------
int Data::a=10;//这句移到Data.h文件中,程序就编译不过去,
那样会造成重复的包含这份a的定义,造成错误
你想用extern int Data::a=10;放在头文件里,这也是不行的,因为这仍然是一份定义,而不是
声明了,仍然产生重复包含错误
------解决方案--------------------
记得是个规定就可以了。
------解决方案--------------------
以上回答都正确
------解决方案--------------------
上面回答的应该就是了。
在.h文件中定义的话,因为你给变量赋值了,是一个定义,而不是声明,会有重复定义错误。
定义会给变量分配空间,而声明不会。
//Data.h
class Data
{
public:
static int GetData();
static void IcrData();
static void SetData(int);
private:
static int a;
};
//Data.cpp
int Data::a=10;//这句移到Data.h文件中,程序就编译不过去,
int Data::GetData()
{
return a;
}
void Data::IcrData()
{
a++;
}
void Data::SetData(int i)
{
a=i;
}
int main()
{
return 0;
}
------解决方案--------------------
因为在h文件中其他文件也存在了int Data::a=10;这一句,所以就会冲突.
------解决方案--------------------
一般情况下 静态成员的初始化应放在cpp中 而不是h中
因为h可能被多个cpp包含(#include),这种情况下 如果是在h中初始化静态成员的 就会造成编译期间的“重定义”错误
------解决方案--------------------
int Data::a=10;//这句移到Data.h文件中,程序就编译不过去,
那样会造成重复的包含这份a的定义,造成错误
你想用extern int Data::a=10;放在头文件里,这也是不行的,因为这仍然是一份定义,而不是
声明了,仍然产生重复包含错误
------解决方案--------------------
记得是个规定就可以了。
------解决方案--------------------
以上回答都正确
------解决方案--------------------
上面回答的应该就是了。
在.h文件中定义的话,因为你给变量赋值了,是一个定义,而不是声明,会有重复定义错误。
定义会给变量分配空间,而声明不会。