7、 num_sequence 的程序及使用

注: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

猜你喜欢

转载自blog.csdn.net/centnetHY/article/details/86712068
num