从模板类继承

时间:2014-02-14 14:12:13

标签: c++ class inheritance

我在fsm.h文件中有一个模板类 和derivata.h文件中的派生类; 编译器抛出错误:

derivata.h: In constructor ‘deri::deri()’:
derivata.h:46: error: no matching function for call to ‘fsm<pin_steps>::fsm()’
fsm.h:30: note: candidates are: fsm<step_type>::fsm(step_type) [with step_type = pin_steps]
fsm.h:12: note:                 fsm<pin_steps>::fsm(const fsm<pin_steps>&)

fsm.h:

#ifndef FSM_H_
#define FSM_H_


template<class step_type> class fsm {
    protected:
        step_type   step;
        step_type   step_old;
        step_type   step_tmp;
        bool        step_pulse;
        char        name[256];
    public:
        fsm(step_type);
        void set_name(char *parent, char *myname);
        void test();
        virtual void update(){cout << "base\n";};
        void show(){cout << step << ' ' << step_tmp << '\n'; };
        void init(step_type st_current) {step = st_current;};
        //virtual ~fsm();
};

//constructor
template <class step_type> fsm<step_type>::fsm(step_type) {
    step = step_old = step_tmp = (step_type)0 ;
    step_pulse = false;
}

template <class step_type> void fsm<step_type>::set_name(char *parent, char *myname) {
    sprintf(name, "%s.%s", parent, myname);
}

template <class step_type> void fsm<step_type>::test() {
    if (step != step_old) {
        step_pulse = true;
        step_tmp = step_old;
    } else step_pulse = false;
    step_old = step;
}

#endif /* FSM_H_ */

和模板类的派生类:

#include "fsm.h"
#ifndef DERIVATA_H_
#define DERIVATA_H_

enum taglio_steps {
    ST_TAGLIO_CHECK_MOTORE,
    ST_TAGLIO_ZERO_MOTORE,
    ST_TAGLIO_WAIT_ZERO_MOTORE
};

enum pin_steps {
    ST_PIN_BOOT,
    ST_PIN_RETURN
};

class deri : public fsm<pin_steps>{
    private:
        bool    cmd_prelevamento_done;
        bool    cmd_scorrimento_done;
        float   posizione_pinza_i;
        float   posizione_pinza_f;
    public:
        deri(){
            cmd_prelevamento_done = false;
            cmd_scorrimento_done = false;
            posizione_pinza_i = 0;
            posizione_pinza_f = 0;
        };
        void update(){cout << "deri\n";};
//      virtual ~deri();
};

#endif /* DERIVATA_H_ */

4 个答案:

答案 0 :(得分:0)

如果(在派生类的构造函数中)没有指定应该调用哪一个,那么基类没有默认的构造函数。如果您不希望fsm成为默认构造,请改为:

deri() : fsm(ST_PIN_BOOT) // call fsm::fsm(pin_steps)
{
    // ...
}

答案 1 :(得分:0)

您的基类没有非参数构造函数,但是在您的派生类中,您调用了一个(自动调用它)。

改变这个:

    deri(){
        cmd_prelevamento_done = false;
        cmd_scorrimento_done = false;
        posizione_pinza_i = 0;
        posizione_pinza_f = 0;
    };

对此(伪代码,我不确定正确的语法,我不经常使用它):

    deri(): fsm<pin_steps>(ST_PIN_BOOT) {
        cmd_prelevamento_done = false;
        cmd_scorrimento_done = false;
        posizione_pinza_i = 0;
        posizione_pinza_f = 0;
    };

答案 2 :(得分:0)

编译器错误似乎很清楚。您没有调用fsm<>构造函数,并且fsm没有默认构造函数。因此,您的选择是:

  • 创建默认构造函数:fsm::fsm() { ... }
  • 或者,在您的情况下更有可能:在deri初始化列表中调用构造函数,如下所示:

    deri() : fsm(step_type_here)
    {
        cmd_prelevamento_done = false;
        cmd_scorrimento_done = false;
        posizione_pinza_i = 0;
        posizione_pinza_f = 0;
    };    
    

我还建议将其他成员变量初始化也放在初始化列表中。

答案 3 :(得分:0)

该代码太大但我认为你需要基类中的默认构造函数。看起来像这样的东西

   public: 
    fsm(); //added
    fsm(step_type);
    void set_name(char *parent, char *myname);
    void test();
    virtual void update(){cout << "base\n";};
    void show(){cout << step << ' ' << step_tmp << '\n'; };
    void init(step_type st_current) {step = st_current;};
    //virtual ~fsm();