BUG描述:
- 一个类内,含有静态成员变量并声明(declare),但是在类外没有定义。这时在类外定义的成员函数需要调用该静态变量时,会报bug,具体说明如下:
- 头文件test.h。test类声明一个类内的静态成员变量mynum。
#ifndef _TEST_H_
#define _TEST_H_
#include <iostream>
#include <string>
using namespace std;
class test{
public:
static int mynum;
string myname;
void set_num(int num);
void set_name(string name);
int get_num() const;
string get_name() const;
};
#endif
- 源文件test.cpp。set_num和get_num两个方法定义在类外,同时需要调用mynum成员变量。 类外并没有对静态成员变量mynum进行定义。
#include "test.h"
void test::set_num(int num){
mynum = num;
}
void test::set_name(string name){
myname = name;
}
int test::get_num() const{
return mynum;
}
string test::get_name() const{
return myname;
}
- 主程序:
#include <test.h>
int main(){
test t1;
return 0;
}
- 这时进行编译,命令:
g++ main.cpp test.cpp -o test
- 报错信息:
/tmp/cclUsIpV.o: In function `test::set_num(int)':
test.cpp:(.text+0x10): undefined reference to `test::mynum'
/tmp/cclUsIpV.o: In function `test::get_num() const':
test.cpp:(.text+0x48): undefined reference to `test::mynum'
collect2: error: ld returned 1 exit statu
原因分析:
- 根据提示,对"test::mynum"未定义引用,导致链接出错。set_num和get_num这两个函数没有找到my_num这个变量的定义,导致错误。
解决方法:
- 解决方法1:将调用静态变量的函数定义在类内,修改test.h,test.h修改如下:将set_num和get_num两个调用静态成员变量的方法定义在类内。
#ifndef _TEST_H_
#define _TEST_H_
#include <iostream>
#include <string>
using namespace std;
class test{
public:
static int mynum;
string myname;
// set_num和set_name类内定义
void set_num(int num){
mynum = num;
}
void set_name(string name);
int get_num() const{
return mynum;
}
string get_name() const;
};
#endif
- 解决方法2:类外对静态成员变量进行声明,修改test.cpp,test.cpp修改如下:在类外对mynum进行声明。
#include <test.h>
// 类外对静态成员mynum进行声明
int test::mynum;
void test::set_num(int num){
mynum = num;
}
void test::set_name(string name){
myname = name;
}
int test::get_num() const{
return mynum;
}
string test::get_name() const{
return myname;
}
参考文献:
1.https://stackoverflow.com/questions/8612206/linker-error-when-using-static-members
2.https://stackoverflow.com/questions/7092765/what-does-it-mean-to-have-an-undefined-reference-to-a-static-member
3.https://isocpp.org/wiki/faq/ctors#link-errs-static-data-mems
4.Essential C++中文版P115
网友评论