C++静态方法访问异常咨询:调用setmor导致mor赋值语句失效
问题原因与解决办法
问题根源
你遇到的问题核心是静态成员变量的声明与定义分离规则:在类内部声明的静态成员变量(比如Zaix里的static int mor;)只是告诉编译器这个变量存在,但并没有为它分配实际的内存空间。当你调用Zaix::setmor(6)试图给mor赋值时,程序找不到mor的内存地址,导致赋值操作失效,甚至在编译链接阶段就会抛出「未定义符号」的错误。
解决办法
只需要在类的外部(和Zaix::beri=3;放在同一位置即可)添加静态成员变量mor的定义,为它分配内存:
#include <iostream> using namespace std; class Zaix { private: static int mor; public: static int beri; static void setmor(int lip) { Zaix::mor=lip; } static int getmor(void) { return mor; } }; // 定义并初始化静态成员beri int Zaix::beri=3; // 定义静态成员mor(可选择是否初始化,这里通过setmor赋值即可) int Zaix::mor; int main() { cout<<Zaix::beri<<endl; Zaix::beri++; cout<<Zaix::beri<<endl; Zaix::setmor(6); // 可以添加这句验证赋值是否成功 cout<<Zaix::getmor()<<endl; return 0; }
补充说明
- 静态成员变量属于类本身,不属于任何对象实例,因此必须在类外部单独定义来分配内存;
- 如果需要给
mor一个默认初始值,也可以在定义时直接赋值,比如int Zaix::mor = 0;; - 你之前的
beri能正常工作,正是因为你在类外部做了int Zaix::beri=3;的定义和初始化,而mor只完成了声明,缺失了定义环节,这就是两者的本质区别。
内容的提问来源于stack exchange,提问作者Edmund Burke
相关产品推荐
相关产品推荐

