开发环境 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++》