注:1、类中定义的静态变量,要在main函数之外的全局空间处定义
2、vector 变量名本身就是地址和数组一样
3、vector也可使用下表访问元素
4、字符串常量不加 const 会报警告:禁止把string对象转换为char *;
使用char* 时 要加 #include <string> 和using namespace std;
5、pause(); #include <unistd.h>
6、类中定义的函数指针 typedef void (num_sequence::*PtrType)(int);
PtrType _pmf = &num_sequence::fibonacci; (不加函数括号,并且有取地址符 &)
num_sequence.h
#include <iostream>
#include <vector>
using namespace std;
class num_sequence
{
public:
typedef void (num_sequence::*PtrType)(int);
enum ns_type
{
ns_unset, ns_fibonacci, ns_pell,
ns_lucas,
};
num_sequence(){};
//num_sequence(int num_seq) : _num_seq(num_seq) {};
// 得到枚举类型
ns_type nstype(int num);
const int num_of_sequence() const { return _num_seq; }
const char *what_am_i() const;
void display(ostream &os, const num_sequence &ns, int pos);
const int elem(int pos) const;
void set_sequence(ns_type);
void init_vec_func(num_sequence &);
void print_vec_data();
void fibonacci(int);
void pell(int);
void lucas(int);
private:
vector<int> *_elem;
PtrType _pmf;
// 静态数据成员必须定义在非main函数之外的全局空间中
static const int _num_seq = 4;
static PtrType _func_tbl[_num_seq];
static vector<vector<int> > _seq;
int _isa; // ns_type
};
inline num_sequence::ns_type num_sequence::nstype(int num)
{
return (num <= 0 || num >= num_of_sequence()) ? ns_unset : static_cast<ns_type>(num);
}
inline void display(ostream &os, const num_sequence &ns, int pos)
{
os << "the element at position "
<< pos << "for the "
<< ns.what_am_i() << " sequence is "
<< ns.elem(pos) << endl;
}
void num_sequence::fibonacci(int a)
{
cout << "This is fibonacci func" << endl;
}
void num_sequence::pell(int a)
{
cout << "This is pell func" << endl;
}
void num_sequence::lucas(int)
{
cout << "This is lucas func" << endl;
main.cc
#include "num_sequence.h"
#include <string>
#include <iterator>
#include <unistd.h> // pause();
using namespace std;
//const int num_sequence::num_seq;
vector<vector<int> > num_sequence::_seq(_num_seq);
// 定义函数指针数组 --在主函数之外的全局变量处定义静态变量
num_sequence::PtrType num_sequence::
_func_tbl[_num_seq] =
{
0,
&num_sequence::fibonacci,
&num_sequence::pell,
&num_sequence::lucas
};
const char *num_sequence::
what_am_i() const
{
// 此处不加const 会报警告
static const char *names[_num_seq] = {
"notSet",
"fibonacci",
"pell",
"lucas"
};
return names[_isa];
}
const int num_sequence::elem(int pos) const
{
// 原代码 此处应该判定是否动态增长,若超出fib lucas
// pell元素最大值,则自动增长添加该位置元素
if (pos <= 0 || pos >= 5)
{
cout << "pos is invailed.\n";
return 0;
}
return (*_elem)[pos - 1];
}
void num_sequence::set_sequence(ns_type type)
{
switch (type)
{
case ns_unset:
default:
_elem = 0;
_pmf = 0;
_isa = 0;
break;
case ns_fibonacci:
case ns_pell:
case ns_lucas:
_elem = &_seq[type];
_pmf = _func_tbl[type];
_isa = type;
break;
}
}
void num_sequence::print_vec_data()
{
vector<int> vec = _seq[2];
vector<int>::iterator it = vec.begin();
for (; it != vec.end(); ++it)
{
cout << *it;
}
cout << "\n";
}
void num_sequence::init_vec_func(num_sequence &ns)
{
int arrayfib[5] = {1,2,3,4,5};
int arraypell[5] = {6,7,8,9,10};
int arraylucas[5] = {11,12,13,14,15};
vector<int> fib(arrayfib, arrayfib + 5);
vector<int> pell(arraypell, arraypell + 5);
vector<int> lucas(arraylucas, arraylucas + 5);
//print_vec_data(fib);
//print_vec_data(pell);
//print_vec_data(lucas);
ns._seq[1] = fib;
ns._seq[2] = pell;
ns._seq[3] = lucas;
}
int main()
{
num_sequence ns;
// 初始化_seq 容器元素 --模拟数据
ns.init_vec_func(ns);
//ns.print_vec_data();
//pause();
#if 1
const int pos = 4;
for (int ix = 1; ix < ns.num_of_sequence(); ++ix)
{
ns.set_sequence(ns.nstype(ix));
//int elem_val = ns.elem(pos);
display(cout, ns, pos);
}
#endif
cout << "init main..\n";
return 0;
}
Makefile
# common makefile header
#C++ = gcc -lstdc++
C++ := g++
#DIR_INC := -I ./include
DIR_INC := -I ./
#DIR_LIB := -Wl,-Bdynamic
#DIR_LIB := -L ./lib -lfastcommon
#DIR_LIB += -lfdfsclient
OBJS := ./main.o
#OBJS += ./util/src/fdfs_file.o
CFLAGS = -Wall -g
TARGET = app
%.o:%.cc
$(C++) $(CFLAGS) $(DIR_INC) $< -o $@ -c
$(TARGET):$(OBJS)
$(C++) $(CFLAGS) $(OBJS) $(DIR_LIB) -o $(TARGET)
#sudo chown root bin/$(TARGET)
#sudo chmod u+s bin/$(TARGET)
clean:
$(RM) $(OBJS) $(TARGET)
# common makefile foot