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++》
C++使用静态类成员时出现的一个问题的更多相关文章
- C#基础知识系列六(静态类和静态类成员)
		
静态类 静态类与非静态类基本相同,但存在一个区别:静态类不能实例化. 也就是说,不能使用 new 关键字创建静态类类型的变量. 因为没有实例变量,所以要使用类名本身访问静态类的成员. 例如,如果名为 ...
 - 静态类和静态类成员(C# 编程指南)
		
静态类与非静态类基本相同,但存在一个区别:静态类不能实例化. 也就是说,不能使用 new 关键字创建静态类类型的变量. 因为没有实例变量,所以要使用类名本身访问静态类的成员. 例如,如果名为 Util ...
 - c++ 静态类成员函数(static member  function) vs 名字空间 (namespace)
		
好多人喜欢把工具函数做成static member function.这样以增加隐蔽性和封装性,由其是从C#,java转而使用c++的开发人员. 例如: class my_math { public: ...
 - 关于C++中的非静态类成员函数指针
		
昨天发现了一个问题,就是使用对类中的非静态成员函数使用std::bind时,不能像普通函数一样直接传递函数名,而是必须显式地调用&(取地址),于是引申出我们今天的问题:非静态类成员函数指针和普 ...
 - C语言中访问结构体成员时用‘.’和‘->’的区别
		
举个例子,定义了一个叫Student,别名为stu的结构类型,我们声明了一个结构体变量叫stu1,声明了一个结构体指针为stuP. typedef struct Student { char name ...
 - [C++] 所有该类的对象共享静态类成员变量
		
问:智能指针可以对指针的引用数量进行计数,一个智能指针释放时,别的智能指针怎么知道的? 同一类的对象共享同一变量最简单的方法是静态变量: 不像普通的变量,静态成员变量是被所有类对象共享的,不同的对象可 ...
 - ios 仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View.
		
仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View. 实现原理,UINavigationController 的 self.view显示时把当前显示的vie ...
 - L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误(转)
		
L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误 错误描述:“ L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误” 只有这个没有错误码. ...
 - PHP进行数据库操作时遇到的一个问题
		
PHP进行数据库操作时遇到的一个问题 昨天在进行数据库操作时,遇到了一个问题(用的是 wampserver 环境): <?php $link = @mysqli_connect('localho ...
 
随机推荐
- Oracle-存储过程实现更改用户密码
			
--调用存储过程实现更改DB用户密码 CREATE OR REPLACE PROCEDURE MODUSERPW(USER_NAME VARCHAR2,USER_PW VARCHAR2)ISSQLTX ...
 - [CSP-S模拟测试]:木叶下(图论)
			
题目传送门(内部题77) 输入格式 第一行一个整数$n$,表示原先的树的点数接下来$n-1$行每行两个整数$a,b$,表示原先的树上的$n-1$条边,保证这$n-1$条边形成一棵树. 接下来一行一个整 ...
 - fengmiantu2
 - 2019年CCPC网络赛 HDU 6703 array【权值线段树】
			
题目大意:给出一个n个元素的数组A,A中所有元素都是不重复的[1,n].有两种操作:1.将pos位置的元素+1e72.查询不属于[1,r]中的最小的>=k的值.强制在线. 题解因为数组中的值唯一 ...
 - (转)C#_WinForm接收命令行参数
			
本文转载自:http://blog.csdn.net/lysc_forever/article/details/38356007 首先,我要仔细的声明下,本文讲的是接受命令行参数,让程序启动.而不是启 ...
 - fedora23安装firefox中的flash插件-最终解决问题是: 要给libflashplayer.so以777权限, 开始给的755权限没有实现!
			
下载的flash插件是一个rpm包. ===================================== rpm查看文件属于哪个包? 要看这个rpm包安装过还是没有安装过? (如果不用-p就是 ...
 - Collector 源码分析
			
Collectors Collectors 配合 stream 可以实现 MapReduce 操作,也可以单独完成流中元素的收集. 收集器接口和实现 /** * 收集器接口 */ public int ...
 - Vue音乐播放器(三):项目目录介绍,以及图标字体、公共样式等资源准备
			
我们所有的开发都是基于修改src下面的目录 里面的文件去做开发即可 stylus的使用是需要下载stylus-loader的包的 渲染效果 配置修改eslintrc.js 配置了webpack.bas ...
 - 003-CHROME开发者工具的小技巧
			
首先调试先进入到调试模式,快键键F12 1.代码格式化 有很多css/js的代码都会被 minify 掉,你可以点击代码窗口左下角的那个 { } 标签,chrome会帮你给格式化掉. 2.强制DOM ...
 - Linux-档案权限概念
			
第一欄代表這個檔案的類型與權限(permission): 這個地方最需要注意了!仔細看的話,你應該可以發現這一欄其實共有十個字元:(圖5.2.1及圖5.2.2內的權限並無關係) 圖5.2.2.檔案的類 ...