我正在为c ++实现Automatak opendnp3库。我想添加Master to a Channel。正如您从此定义中看到的,此操作的参数是:
...
opendnp3::IMasterApplication& appliction,
...
IMasterApplication接口描述为here。所以我创建了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;
我在这里误解了什么?
答案 0 :(得分:3)
如注释中所述,每当实现抽象类(接口)时,必须在派生类中定义属于抽象类的所有纯虚方法(在主体中提供)。然后只有派生类变得具体,并且可以用作类型。否则它也会变得抽象。
“那么方法的声明是否使它成为非抽象的?”
不是声明,而是定义。方法已在基类(接口)中声明(作为纯虚拟)。在派生类中赋予它们定义(主体)会使派生类非抽象(具体)。
“另外,我是否只需在masterApplication中声明它而不实际使用它?”
您需要定义派生类中基类的所有纯虚方法。是否使用取决于您的使用情况。
答案 1 :(得分:3)
查看opendnp3::IMasterApplication
,您可以看到它继承自opendnp3::ILinkListener
和opendnp3::IUTCTimeSource
。
虽然第一个没有任何纯虚方法,但这里是第二个代码(source):
class IUTCTimeSource
{
public:
virtual UTCTimestamp Now() = 0;
};
然后,您需要重载类Now()
中的函数masterApplication
,以使其不抽象。