请各位高手帮忙调试一下这个程序!!
/*--静态成员变量--*/
#include <iostream.h>
class shared
{
private:
static int a; /*--Build failed--*/
int b;
public:
void set(int i,int j){a=i;b=j;}
void show();
};
void shared::show()
{
cout<<"This is static a:"<<a;
cout<<"\nThis is non-statick b:"<<b;
cout<<"\n";
}
void main()
{
shared x,y;
x.set(1,1);
x.show();
y.set(2,2);
y.show();
x.show();
}
这段程序编译能通过,运行时出现错误,内容如下:
--------------------Configuration: main - Win32 Debug--------------------
Linking...
main.obj : error LNK2001: unresolved external symbol "private: static int shared::a" (?a@shared@@0HA)
Debug/main.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe.
main.exe - 2 error(s), 0 warning(s)
这是为什么??
问题点数:50、回复次数:8Top
1 楼inline(★ 虚函数【虚英语】☆)回复于 2003-12-02 16:03:01 得分 10
在类定义外加一句!因为静态成员在类外要有定义!
int shared::a = 0;Top
2 楼wu_apple(吴冰)回复于 2003-12-02 16:13:12 得分 0
nod
Top
3 楼RedFoxC(赤狐)回复于 2003-12-02 16:25:07 得分 10
静态成员 a 没有初始化,当然出现错误拉!
在函数main() 的前面,初始化 int shared::a=0; 即可!!Top
4 楼caocao81(曹孟德)回复于 2003-12-02 22:05:48 得分 0
各位高手,听了各位建议后可以运行了,但谁能详细回答一下我的这个问题我马上结贴.即:
我看在C++ primer一书中有这样的说法,静态成员在没有初始化时是会自动的被初始化为0的,既然这样,为什么要手动的显示初始化呢?不初始化不行吗?Top
5 楼smalltalk(老徐)回复于 2003-12-02 22:54:35 得分 10
初始化和定义是不同的概念;如果一个成员变量是static,那么它必须在全局定义,至于初始值是什么,要看你定义是负的是什么。
C++ primer一书中有这样的说法,静态成员在没有初始化时是会自动的被初始化为0,就是指如果定义时不指定初始值,那就是0.
Top
6 楼inline(★ 虚函数【虚英语】☆)回复于 2003-12-03 00:30:52 得分 10
因为静态成员是类及类的所有对象共同维护的一个成员!相当于一个操作受限的全局变量!
所以编译器看到类定义中的静态成员引用性声明时会到外部去找这个全局变量!
而当你在外部没有实际定义这个静态成员时!会使编译器陷入尴尬!Top
7 楼liquanle()回复于 2003-12-03 01:14:08 得分 10
a 是静态数据,要在类外面初始化用int 类名::数据名=30;来初始化。Top
8 楼langmng(波涛)回复于 2003-12-03 01:44:52 得分 0
UPTop




