• C++模板类的使用


    1、定义模板类

      通过类似于下面的语法可以定义一个模板类:

    template<typename T>
    class Job : public virtual RefBase {
    public:
        class JobListener : public virtual RefBase {
        public:
            virtual void OnJobDone(sp< Job<T> >& job) {}
        };
        typedef enum {
            JOB_STATE_IDLE = 0,
            JOB_STATE_RUNNING = 1,
            JOB_STATE_SUCCESS = 2,
            JOB_STATE_FAIL = 3,
            JOB_STATE_CANCELLED = 4,
        } job_status_t;
    public:
        //Job(string name, sp<T>& data);
        Job(){}
        Job(string name, sp<T>& data, sp<JobListener>& listener)
        virtual ~Job(){}
    
        void set_job_listener(sp<JobListener>& listener) { job_listener_ = listener;}
    };

    template<typename T>

    Job<T>::Job(string name, sp<T>& data, sp<JobListener>& listener):
      name_(name),
      data_(data),
      job_listener_(listener),
      run_next_when_fail_flag_(true),
      state_(JOB_STATE_IDLE),
      job_error_(NULL),
      next_jobs_(2) {
    }

     

    2、定义模板成员函数

      每个函数头都要以相同的模板声明打头,并将类限定符改成:类名<T>::这种形式。参见上面代码中的Job构造函数。

    3、模板的使用方法

      通过这样的代码可以实现一个特定类型的模板对象:

    Job<JobController>* jcx = new Job<JobController>("", jct, jjl);

    4、特别注意!

      除非编译器实现了新的export关键字,否则将模板成员函数设置在一个独立的实现文件中将无法运行。因为模板不是函数,它们不能单独编译。模板必须与特定的模板实例化请求一起使用。为此,最简单的方法是将所有模板信息放在一个头文件里,并在要使用这些模板的文件中包含该头文件。如果编译器实现了心得export关键字,则可以将模板方法定义放在一个独立文件中,条件是每个模板声明都是以export开始:

    #ifdef STACKTP_H_
    #define STACKTP_H_
    
    export template<class T>
    class Stack
    {
        ......
    }
    
    #endif

      然后按常规类的方式进行:

    (1)将模板类声明(包括关键字export)放在一个头文件中,并使用#include编译指令时程序能够使用这些声明。

    (2)将模板类的方法定义放在源代码文件中,在该文件中包含头文件,并使用工程文件时程序能够使用这些定义。

    参考链接:http://blog.csdn.net/guoxiaoqian8028/article/details/7977202

  • 相关阅读:
    设计【SPFA】【差分约束】
    黑魔法师之门【并查集】
    太鼓达人【欧拉回路】【DFS】
    七夕祭【模拟】
    圣章精灵使的魔法语【线段树】
    终章剑之魂【模拟】【贪心】
    轻轨【线段树】【贪心】
    气象牛【DP】
    HTML属性
    HTML元素
  • 原文地址:https://www.cnblogs.com/kuliuheng/p/5531898.html
Copyright © 2020-2023  润新知