开发环境 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. 我用HTML写简历

    本文属于原创文章,转载请注明--来自桃源小盼的博客 起因 每次换工作写简历都是有点痛苦的事情,尤其是下载word模板,各种注册流程,有的还得买积分,冲会员,甚是不爽.就算下载好了,修改其中的一些细节也 ...

  2. SQL 基本查询语句

    --使用数据库 use date go --创建表班级表 create table classInfo ( classNo ,),--主键约束使用primary key identity classN ...

  3. oracle各服务说明及cmd启动启动命令

    成功安装Oracle 11g后,共有7个服务,一.这七个服务的含义分别为:1. Oracle ORCL VSS Writer Service:Oracle卷映射拷贝写入服务,VSS(Volume Sh ...

  4. cefsharp 在高DPI下闪烁的问题

    今天有客户朋友说程序在他的surface下界面很闪烁,搜索了相关的资料,初步判定是DPI引起的问题,但也有可能是cefsharp 51版本在WIN10上面没有禁用GPU加速,苦于没有环境测试,所以抱着 ...

  5. vsphere client 虚拟机随主机自动启动

  6. oracle查询语句,根据中文的拼音排序

    SELECT * FROM USER t ORDER BY nlssort(FIRSTNAME, 'NLS_SORT=SCHINESE_PINYIN_M')

  7. leetcode 40. 组合总和 II (python)

    给定一个数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合. candidates 中的每个数字在每个组合中只能使用一次. ...

  8. 关于崩溃报告的日志以及dump文件

    在用户使用软件的过程当中突然产生软件崩溃的问题,必须采取相关的措施去拦截崩溃产生的原因,这有助于程序员解决此类崩溃的再次发生.特别是有些难以复现的崩溃,不稳定的崩溃,更有必要去调查崩溃产生的原因.一般 ...

  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_05 IO字符流_2_字符输入流读取字符数据

    读取的文件有中文也有英文 强转为char类型 缓冲读取多个字符 使用string的构造方法转换为字符输出

  10. appium xpath元素定位

    1.id定位 写法:driver.find_element_by_id("这里是resource-id") 2.name定位 name定位就是通过UI Automator工具查看的 ...