查看以下代码:
// abc.h
class abc{ public: static int a; void init(); };
// abc.cpp
#include"abc.h"
int abc::a;
void abc::init(){
abc::a = 10;
}
// main.cpp中
#include<iostream>
#include"abc.h"
int main(){
std::cout << abc::a;
return 0;
}
基本上我想要实现的是一个类写入静态变量而另一个类从中读取。写操作在每次读取之前发生。我收到以下错误:
anvith@anvdebian:~/test$ g++ main.cpp
/tmp/ccREguak.o:main.cpp:function main: error: undefined reference to 'abc::a'
collect2: error: ld returned 1 exit status
请帮助我确切地说我做错了什么。
答案 0 :(得分:0)
好的,你有一个abc类,它有一个静态成员a和一个函数init()。您在程序中没有的(在您的示例中为main)是类abc的任何实际实例。因此:
一个。没有可以调用init()的abc实例。
湾链接器不会在最终程序中包含abc :: a - 我认为你永远不会得到静态成员变量,除非你在某处有至少一个相关对象。
所以至少应该添加:
abc g_abc;
g_abc.init();
在cout之前的main()内。
另外,正如Mat所说,你需要将abc.cpp链接到你的项目中,否则你在程序中没有abc :: a或abc :: init()。
你可能想要考虑一个构造函数,它在创建时初始化一个abc对象,但是如果构造函数唯一能做的就是设置a的值,这可能不是你想要的,因为它将被重置每次你做一个新的abc。你可以改变“int abc :: a;”这一行在abc.cpp中“int abc :: a = 0;”以便在程序启动时初始化。