开发环境 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++使用静态类成员时出现的一个问题的更多相关文章

  1. C#基础知识系列六(静态类和静态类成员)

    静态类 静态类与非静态类基本相同,但存在一个区别:静态类不能实例化. 也就是说,不能使用 new 关键字创建静态类类型的变量. 因为没有实例变量,所以要使用类名本身访问静态类的成员. 例如,如果名为 ...

  2. 静态类和静态类成员(C# 编程指南)

    静态类与非静态类基本相同,但存在一个区别:静态类不能实例化. 也就是说,不能使用 new 关键字创建静态类类型的变量. 因为没有实例变量,所以要使用类名本身访问静态类的成员. 例如,如果名为 Util ...

  3. c++ 静态类成员函数(static member function) vs 名字空间 (namespace)

    好多人喜欢把工具函数做成static member function.这样以增加隐蔽性和封装性,由其是从C#,java转而使用c++的开发人员. 例如: class my_math { public: ...

  4. 关于C++中的非静态类成员函数指针

    昨天发现了一个问题,就是使用对类中的非静态成员函数使用std::bind时,不能像普通函数一样直接传递函数名,而是必须显式地调用&(取地址),于是引申出我们今天的问题:非静态类成员函数指针和普 ...

  5. C语言中访问结构体成员时用‘.’和‘->’的区别

    举个例子,定义了一个叫Student,别名为stu的结构类型,我们声明了一个结构体变量叫stu1,声明了一个结构体指针为stuP. typedef struct Student { char name ...

  6. [C++] 所有该类的对象共享静态类成员变量

    问:智能指针可以对指针的引用数量进行计数,一个智能指针释放时,别的智能指针怎么知道的? 同一类的对象共享同一变量最简单的方法是静态变量: 不像普通的变量,静态成员变量是被所有类对象共享的,不同的对象可 ...

  7. ios 仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View.

    仿新浪微博 UINavigationController 向左滑动时显示上一个控制器的View. 实现原理,UINavigationController 的 self.view显示时把当前显示的vie ...

  8. L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误(转)

    L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误   错误描述:“ L2TP连接尝试失败,因为安全层在初始化与远程计算机的协商时遇到了一个处理错误” 只有这个没有错误码. ...

  9. PHP进行数据库操作时遇到的一个问题

    PHP进行数据库操作时遇到的一个问题 昨天在进行数据库操作时,遇到了一个问题(用的是 wampserver 环境): <?php $link = @mysqli_connect('localho ...

随机推荐

  1. Oracle传输数据到Sqlserver

    通过Sqlserver的SSIS工具实现数据传输

  2. Splinter 的认识和基础应用

    Splinter 是一个使用Python开发的开源web应用测试程序,它可以帮助我们实现自动浏览站点和与其进行交互.它是依赖于其它python插件或拓展进行的,所以我们使用它之前需要安装一系列的依赖包 ...

  3. 在vue中如何引jquer

    最近学习vue,习惯性的通过<script>标签引入jquery,写完后报错才想起来,这种方式在vue是不适用的. 1:因为已经安装了vue脚手架,所以需要在webpack中全局引入jqu ...

  4. 十八、浏览器不能打开jenkins报告,报错Opening Robot Framework report failed

    解决方案一:(推荐) 打开jenkins----系统管理---输入:  System.setProperty("hudson.model.DirectoryBrowserSupport.CS ...

  5. VMware 虚拟化编程(12) — VixDiskLib Sample 程序使用

    目录 目录 前文列表 vixDiskLibSample 安装 Sample 程序 Sample 程序使用方法 前文列表 VMware 虚拟化编程(1) - VMDK/VDDK/VixDiskLib/V ...

  6. 阶段1 语言基础+高级_1-3-Java语言高级_03-常用API第二部分_第3节 Calendar类_1_Calendar类介绍_获取对象的方式

    Calendar.getInstance()返回的就是Calendar的子类对象.GregorianCalendar 说明Calendar类重写了toSting的方法 时区亚洲的上海

  7. delphi如何按照控件的左右顺序来遍历窗体中的每个控件 [问题点数:20 http://bbs.csdn.net/topics/380216822

    delphi如何按照控件的左右顺序来遍历窗体中的每个控件delphi默认是按照控件添加进窗体的顺序来遍历的,有没有哪个属性能控制这个/?? 更多0分享到:   对我有用[0] 丢个板砖[0] 引用 | ...

  8. altium笔记转载

    原理图的设计 1.左键单击元器件按住space键可以将其旋转,按X键左右旋转:按Y键上下旋转. 2.智能粘贴:Edit àsmart paste . 3.屏障:compile mask(编译时被屏障的 ...

  9. 《好久不见》(Cover 陈奕迅)箫声远 洞箫

    Your browser does not support the audio element.

  10. Tensorflow实战(二):Discuz验证码识别

    一.前言 验证码是根据随机字符生成一幅图片,然后在图片中加入干扰象素,用户必须手动填入,防止有人利用机器人自动批量注册.灌水.发垃圾广告等等 . 验证码的作用是验证用户是真人还是机器人. 本文将使用深 ...