类的static变量与函数
我在类中的定义如下
static double m_TotalMoney;
static char m_MultiPay[128];
static SetTolalMoney(double AllMoney){m_TotalMoney=AllMoney;}
static SetMultiPay(char * ThePay) {strcpy(m_MultiPay,ThePay);}
但我在类中使用
CCasher::SetTolalMoney(m_dGpayall);
时总是
error LNK2001: unresolved external symbol "public: static double CCasher::m_TotalMoney" (?m_TotalMoney@CCasher@@2NA)
Debug/CASH.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
为什么?我该如何定义static变量、函数,如何使用他们?
问题点数:30、回复次数:8Top
1 楼theSky(云霄)回复于 2001-04-10 18:12:00 得分 10
举个例子:
在a.h文件中:
class A
{
public:
A() {}
~A() {}
static void Set(int n) { m_n = n; }
protected:
static int m_n;
}
在a.cpp(或别的cpp)文件中:
int A::m_n = 0; <== 你少了这一行。Top
2 楼panda_w(好想睡啊!)回复于 2001-04-10 18:14:00 得分 10
很多书上都有的:
类的静态成员是为类的全体服务,这一点与非静态成员函数不同.也就是说它的生命周期类似于全局函数.
例如:
class CMyClass
{
static s_Func() {NULL;}
Func() {NULL;}
};
...
CMyClass::s_Func(); // OK
CMyClass::Func() // error!!!, 一般成员函数必须由具体的对象调用
CMyClass a;
a.Func(); // OK, 就象这样才行
静态成员函数不同访问一般的数据成员,只能访问静态数据成员,也只能调用其他的静态成员函数.
静态成员函数没有this指针. Top
3 楼ggyy(带着一堆光棍找朋友!)回复于 2001-04-10 18:54:00 得分 0
aTop
4 楼yemagxy(把酒言欢)回复于 2001-04-10 19:13:00 得分 0
类的静态成员变量不可以在类的构造函数和文件的头文件中进行初始化,因为可能会造成多次初始化,必须在main函数中或全局函数中或者任何函数之外进行初始化。如果你没有进行这样的初始化,就会出现你提到的链接错误。你可以看看《深入浅出MFC》第2章,讲的很清楚。Top
5 楼pyhjy()回复于 2001-04-11 10:06:00 得分 0
我在类外声明静态数据成员以便为其分配存储空间,可编译后却说变量已经定义
double CCasher::m_TotalMoney;
char CCasher::m_MultiPay[128];
"public: static double CCasher::m_TotalMoney" (?m_TotalMoney@CCasher@@2NA) already defined in Casher.obj
"public: static char * CCasher::m_MultiPay" (?m_MultiPay@CCasher@@2PADA) already defined in Casher.obj
为什么?应该如何做?Top
6 楼pyhjy()回复于 2001-04-11 13:44:00 得分 0
help help......Top
7 楼loutingyv(打倒轮子)回复于 2001-04-11 15:18:00 得分 0
把声明放到c文件中试试
我以前也有同样的问题。Top
8 楼In355Hz(好象一条狗)回复于 2001-04-11 19:15:00 得分 10
double CCasher::m_TotalMoney = 0;
char CCasher::m_MultiPay[128] = { 0 };
放到相关的*.cpp文件中去。定义不变。
这两个函数这样写:
static SetTolalMoney(double AllMoney){CCasher::m_TotalMoney=AllMoney;}
static SetMultiPay(char * ThePay) {strcpy(CCasher::m_MultiPay,ThePay);}Top




