使用声明实现此摘要 Class

Implementing this Abstract Class using a declaration

我正在实现 Automatak opendnp3 libraries for c++. I want to add a Master to a Channel。正如您从这个定义中看到的,这个动作的一个参数是:

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

描述了 IMasterApplication 接口 here。所以我创建了 masterApplication.cpp 和 masterApplication.h 文件并尝试按如下方式实现 class:

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;

我误会了什么?

如评论中所述,每当实现抽象 class (接口)时,必须在中定义(提供主体)作为抽象 class 一部分的所有纯虚拟方法派生 class。然后只有派生的 class 变得具体,并且可以用作类型。否则也变得抽象了。

"So does the declaration of a method make it non-abstract?"

不是声明,而是定义。方法已经在基础 class (接口)中声明(作为纯虚拟)。在派生 class 中给它们定义(正文)使派生 class 非抽象(具体)。

"Also, do I just have to declare it in masterApplication without actually using it? "

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

完成:

看一下 opendnp3::IMasterApplication,您可以看到它继承了 opendnp3::ILinkListeneropendnp3::IUTCTimeSource

虽然第一个没有任何纯虚方法,但这是第二个的代码 (source):

class IUTCTimeSource
{

public:
    virtual UTCTimestamp Now() = 0;
};

然后您需要在 class masterApplication 中重载函数 Now() 以使其成为非抽象的。