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 ...
随机推荐
- Coffee Chicken
Coffee Chicken 字符串斐波那契 输出第s[n]个字符串的第k位及后十位 暴力算出前20项,超过20,跑dfs #include<bits/stdc++.h> using na ...
- es之Source字段和store字段
PUT /website/blog/ { "title" : "elasticsearchshi是是什么", "author" : &quo ...
- CSS札记(一):CSS选择器
一.语法规则 选择器{ 属性1:属性值1; 属性2:属性值2; ...... } /*注释*/ 二.如何在html中应用CSS 1. 外部引用css文件 css文件:css/layout.css(cs ...
- mysql分组,行转列
aaarticlea/jpeg;base64,/9j/4QEsRXhpZgAASUkqAAgAAAAPAJqCCgABAAAAwgAAABABAgAQAAAAygAAAAABAwABAAAAQBAAA
- view组件
view标签的属性值: hover-class:按下的点击态 属性值:字符串 如果:hover-class="none" 按下就没有点击态 hover-stop-pro ...
- optistruct非线性分析步子步设置
The CNTNLSUB command can be used in the Subcase Information section to continue a nonlinear solution ...
- Delphi XE2 之 FireMonkey 入门(27) - 数据绑定: TBindingsList: TBindScope
Delphi XE2 之 FireMonkey 入门(27) - 数据绑定: TBindingsList: TBindScope 如果在编写表达式时, 如果能够随意指认需要的控件就好了(通过 Owne ...
- Vue中解决路由切换,页面不更新的实用方法
前言:vue-router的切换不同于传统的页面的切换.路由之间的切换,其实就是组件之间的切换,不是真正的页面切换.这也会导致一个问题,就是引用相同组件的时候,会导致该组件无法更新,也就是我们口中的页 ...
- 字符串 映射相应的 函数 字符串驱动技术—— MethodAddress , MethodName , ObjectInvoke
http://blog.csdn.net/qustdong/article/details/7267258 字符串驱动技术—— MethodAddress , MethodName , ObjectI ...
- python实现建立websocket通信
实现代码如下: #websocket协议通信 import threading import time import websocket def when_message(ws, message): ...