C++私有静态类成员初始化问题:跨类调用Setter触发未解析符号错误
错误原因分析与修正方案
错误原因
C++规定:类的静态成员变量仅在类内部声明是不够的,必须在类外部单独定义(为其分配内存空间)。你的代码里,foo类的static string goo和static long int doo只是在类中做了声明,没有在类外部定义,导致链接器找不到这两个静态成员的实际内存地址,从而抛出LNK2001未解析外部符号错误。
另外,你在moo类中通过foo对象调用静态方法的逻辑是合法的(静态方法既可以通过类名调用,也可以通过对象实例调用),这部分没有问题。
修正方案
完全符合你的代码限制(不切换成员静态/非静态属性、不修改访问权限、保留moo类中foo对象调用方法的逻辑),只需在类定义之后、main函数之前,补充foo类静态成员的定义即可。
修改后的完整代码
#include <iostream> using namespace std; class foo { private: static string goo; static long int doo; public: static void setGoo(string gooString) { goo = gooString; } static void setDoo(long int dooLongInt) { doo = dooLongInt; } static string getGoo() { return goo; } static long int getDoo() { return doo; } }; // 补充foo类静态成员的外部定义,满足C++语法要求 string foo::goo; long int foo::doo; class moo { private: foo fooObj; public: void setGoo(string gooString) { fooObj.setGoo(gooString); } void setDoo(long int dooLongInt) { fooObj.setDoo(dooLongInt); } string getGoo() { return fooObj.getGoo(); } long int getDoo() { return fooObj.getDoo(); } }; int main() { moo mainMoo; string text = "Text"; mainMoo.setGoo(text); mainMoo.setDoo(123); cout << mainMoo.getGoo(); cout << mainMoo.getDoo(); return 0; };
说明
- 补充的
string foo::goo;和long int foo::doo;是静态成员的定义,即使它们是private权限,类外部的定义操作也是合法的(这是C++语法强制要求,与访问权限无关)。 - 没有修改任何原有代码的结构:
foo的成员依然是静态私有,moo类依然通过foo对象调用静态方法,完全符合你的限制条件。
内容的提问来源于stack exchange,提问作者Peter Smedskjaer
相关产品推荐
相关产品推荐

