使用声明实现此摘要 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::ILinkListener
和 opendnp3::IUTCTimeSource
。
虽然第一个没有任何纯虚方法,但这是第二个的代码 (source):
class IUTCTimeSource
{
public:
virtual UTCTimestamp Now() = 0;
};
然后您需要在 class masterApplication
中重载函数 Now()
以使其成为非抽象的。
我正在实现 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::ILinkListener
和 opendnp3::IUTCTimeSource
。
虽然第一个没有任何纯虚方法,但这是第二个的代码 (source):
class IUTCTimeSource
{
public:
virtual UTCTimestamp Now() = 0;
};
然后您需要在 class masterApplication
中重载函数 Now()
以使其成为非抽象的。