开发环境 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. 180128-----Java面试题

    1 不用第三个变量,交换两个的值 a=1;b=2;a=a+b;b=a-b;a=a-b; 2 Java动态代理用什么实现? 反射

  2. 高通Camera bring up软件流程【转】

    本文转载自:http://blog.csdn.net/liwei16611/article/details/51279658 高通camera bring up分为两种类型:YUV和bayerbrin ...

  3. Linux内核调试方法总结之调试宏

    本文介绍的内核调试宏属于静态调试方法,通过调试宏主动触发oops从而打印出函数调用栈信息. 1) BUG_ON 查看bug处堆栈内容,主动制造oops Linux中BUG_ON,WARN_ON用于调试 ...

  4. 查询数据库对象的DDL信息

    表的DDL select dbms_metadata.get_ddl('HBBL','TABLE','AGREEMENT_MIRROR') from dual:

  5. bp文件错误消除

    代码文件报错, error: unused parameter 'data' [-Werror,-Wunused-parameter]‘ 按提示在cflags中加入: "-Wunused-p ...

  6. Oracle-优化SQL语句

    建议不使用(*)来代替所有列名 用truncate代替delete 在SQL*Plus环境中直接使用truncate table即可:要在PL/SQL中使用,如: 创建一个存储过程,实现使用trunc ...

  7. linux安装 redis(redis-3.0.2.tar.gz) 和 mongodb(mongodb-linux-x86_64-rhel62-4.0.0)

    1:首先 要下载 这两个 压缩包 注意:liunx是否已经安装过 gcc没安装的话 先安装:yum install gcc-c++ 2:安装 redis:redis-3.0.2.tar.gz (1): ...

  8. 安全运维 - Linux系统攻击应急响应

    Linux 应急相应 - 总纲 应急准备: 制定应急策略 组建应急团队 其他应急资源 安全事件处理: 痕迹数据获取 分析.锁定攻击源删除可疑账号关闭异常进程.端口禁用相应异常开机启动项删除异常定时任务 ...

  9. 20190928 On Java8 第二十三章 注解

    第二十三章 注解 定义在 java.lang 包中的5种标准注解: @Override:表示当前的方法定义将覆盖基类的方法.如果你不小心拼写错误,或者方法签名被错误拼写的时候,编译器就会发出错误提示. ...

  10. SpringMvc+Mybatis开发需要的jar包

    SpringMvc+Mybatis开发需要的jar包