我正在为C ++实现Automatak opendnp3库。我想添加一个Master to a Channel。从该定义可以看到,此操作的参数为:

...
opendnp3::IMasterApplication& appliction,
...


here中描述了IMasterApplication接口。因此,我创建了masterApplication.cpp和masterApplication.h文件,并尝试实现该类,如下所示:

masterApplication.cpp

 #include "masterApplication.h"

 #include <opendnp3/master/IMasterApplication.h>

 #include <iostream>
 #include <chrono>

 using namespace opendnp3;
 using namespace asiodnp3;
 using namespace std;

 masterApplication::masterApplication() {
    }

 masterApplication::~masterApplication() {
    }


masterApplication.h

#ifndef MASTERAPPLICATION_H_
#define MASTERAPPLICATION_H_

 #include <opendnp3/master/IMasterApplication.h>
 #include <opendnp3/link/ILinkListener.h>
 #include <openpal/executor/IUTCTimeSource.h>

 class masterApplication : public opendnp3::IMasterApplication
 {
 private:

 public:
    masterApplication();
    virtual ~masterApplication();
 };

 #endif


但是,当我尝试在main中声明一个masterApplication对象以使用时:

masterApplication iMaster;


然后将其放在AddMaster函数中,我得到错误:

main.cpp:57:20: error: cannot declare variable ‘iMaster’ to be of abstract type ‘masterApplication’
   masterApplication iMaster;


我在这里误会什么?

最佳答案

如评论中所述,无论何时实现抽象类(接口),都必须在派生类中定义抽象类的所有纯虚方法(带有主体)。然后,只有派生的类成为具体的,并且可以用作类型。否则,它也会变得抽象。

“那么,方法的声明是否使其非抽象?”

不是声明,而是定义。方法已经在基类(接口)中声明为纯虚拟方法。在派生类中给它们定义(主体)会使派生类成为非抽象(具体)。

“而且,我是否只需要在masterApplication中声明它而不实际使用它?”

您需要在派生类中定义基类的所有纯虚方法。是否使用它们取决于您的用例。

08-28 06:00