美文网首页
C++类里静态成员链接错误

C++类里静态成员链接错误

作者: 不懂球的2大业 | 来源:发表于2019-12-03 20:08 被阅读0次

    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

    相关文章

      网友评论

          本文标题:C++类里静态成员链接错误

          本文链接:https://www.haomeiwen.com/subject/xkdhgctx.html