• C++使用静态类成员时出现的一个问题


    开发环境 Qt Creator 4.8.2
    编译器 MinGw 32-bit
    在类中定义了一个static data member

    class Triangular{
    
    public:
        static bool is_elem(int);
        static void gen_elems_to_value(int);
    private:
        int _length; //元素的数量
        int _beg_pos; //起始位置
        int _next;  //下一个迭代目标
    
        static const int _max_elems = 1024;
        static vector<int> _elems;  //静态数据成员
    };
    
    void Triangular::gen_elems_to_value(int value)
    {
        int ix = _elems.size();
        if(!ix)
        {
            _elems.push_back(1);
            ix = 1;
        }
    
        while (_elems[ix - 1] < value && ix < _max_elems)
        {
            _elems.push_back(ix * (ix + 1) / 2);
            ++ix;
        }
    
        if(ix == _max_elems)
        {
            cout << "Triangular Sequence: oops: value too large"
                 << value << "-- exceeds max size of " << _max_elems << endl;
        }
    }
    
    /*
     * 给定某值,依据该值是否在Triangular数列内而返回true或false
    */
    bool Triangular::is_elem(int value)
    {
        if(!_elems.size() || _elems[_elems.size() - 1] < value)
        {
            gen_elems_to_value(value);
        }
    
        vector<int>::iterator fount_it;
        vector<int>::iterator end_it = _elems.end();
    
        fount_it = find(_elems.begin(),end_it,value);
        return fount_it != end_it;
    }
    

    当编译程序时,报错

     error: undefined reference to `Triangular::_elems'
    

    提示Triangular类中_elems没有定义。
    解决办法:
    对class而言,static data member只有唯一的一份实体,因此我们必须在程序代码文件中提供其清楚的定义。

    //以下放在程序代码文件中
    vector<int> Triangular::_elems;
    

    再次编译,错误消失。

    • 第二次遇到同样的错误

    开发环境 VS2017

    #include "pch.h"
    #include <iostream>
    using namespace std;
    
    
    
    class Singleton
    {
    private:
    	static Singleton* instance;
    private:
    	Singleton()  //构造方法让其private,这就堵死了外界利用new创建此类实例的可能
    	{
    
    	}
    public:
    	static Singleton* GetInstance()  //此方法是获得本类实例的唯一全局访问节点
    	{
    		if (instance == NULL)
    		{
    			instance = new Singleton();
    		}
    		return instance;
    	}
    };
    
    
    
    int main()
    {
    	Singleton* s1 = Singleton::GetInstance();
    	Singleton* s2 = Singleton::GetInstance();
    	if (s1 == s2)  //比较两次实例化后对象的结果是实例相同
    	{
    		cout << "两个对象是相同的实例" << endl;
    	}
    	return 0;
    }
    
    

    编译报错

    错误	LNK2001	无法解析的外部符号 "private: static class Singleton * Singleton::instance" (?instance@Singleton@@0PAV1@A)	
    

    也是在类中定义了一个static的成员变量,但是并没有在类外初始化,加入以下代码,编译通过

    Singleton* Singleton::instance = NULL;
    

    参考资料:
    1 《Essential C++》

  • 相关阅读:
    递增三元子序列
    Linux sed 命令
    linux shell中$0,$?,$!等的特殊用法
    ansible-playbook使用
    Linux下通过crontab命令来实现定时任务
    iperf网络性能测试
    OpenStack接口测试工具rally/tempest环境搭建及使用
    Jenkins配置slaver节点
    微信小程序跳转外部链接(h5页面)以及数据交互
    Echarts 系列之折线图、柱状图相关配置
  • 原文地址:https://www.cnblogs.com/Manual-Linux/p/10996457.html
Copyright © 2020-2023  润新知