//静态类成员
//为多个类对象共享
#include<iostream>
#include<vector>
using namespace std;
class Triangular
{
public:
static bool is_elem(int);
static void gen_elements(int length);
static void gen_elements_to_vaule(int vaule);//成员函数只有在不访问任何非静态成员的基础上才能够被声明为static
private:
static const int _max_elems = 1024;
static vector<int>_elems;
};
bool Triangular::is_elem(int vaule) //静态成员函数在类外定义时,无需重复加上static
{
if (!_elems.size() || _elems[_elems.size() - 1] < vaule)
gen_elements_to_vaule(vaule);
vector<int>::iterator found_it;
vector<int>::iterator end_it = _elems.end();
found_it = find(_elems.begin(), end_it, vaule);
return found_it != end_it;
}
void Triangular::gen_elements(int length)
{
if (length < 0 || length > _max_elems) {
cerr << "Triangular Sequence: oops: invalid size: "
<< length << " -- max size is "
<< _max_elems << endl;
return;
}
if (_elems.size() < length)
{
int ix = _elems.size() ? _elems.size() + 1 : 1;
for (; ix <= length; ++ix)
_elems.push_back(ix*(ix + 1) / 2);
}
}
void Triangular::gen_elements_to_vaule(int value)
{
int ix = _elems.size();
if (!ix) {
_elems.push_back(1);
ix = 1;
}
while (_elems[ix - 1] < value && ix < _max_elems)
{
// cout << "elems to value: " << ix*(ix+1)/2 << endl;
_elems.push_back(ix*(ix + 1) / 2);
++ix;
}
if (ix == _max_elems)
cerr << "Triangular Sequence: oops: value too large "
<< value << " -- exceeds max size of "
<< _max_elems << endl;
}
int main()
{
char ch;
bool more = true;
while (more)
{
cout << "Enter value: ";
int ival;
cin >> ival;
bool is_elem = Triangular::is_elem(ival); //静态成员函数的调用方式
cout << ival
<< (is_elem ? " is " : " is not ")
<< "an element in the Triangular series.\n"
<< "Another value? (y/n) ";
cin >> ch;
if (ch == 'n' || ch == 'N')
more = false;
}
return 0;
}