2015-09-30 5 views
0

Я реализую библиотеки Automatak opendnp3 для C++. Я хочу добавить 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 

Но, когда я пытаюсь объявите объект mainApplication в моем основном пользовании:

masterApplication iMaster; 

А затем pl асе, что в AddMaster функции , я получаю ошибку:

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

Что я недоразумение?

+2

Вы реализовали все чистые виртуальные методы, объявленные в 'IMasterApplication', в классе' masterApplication'? – CinCout

+0

Нет, я этого не делал? Я не объявлял ничего, кроме конструктора и деструктора. –

+2

Да, это так. В противном случае 'masterApplication' остается абстрактным. – CinCout

ответ

3

Как указано в комментарии, при реализации абстрактного класса (интерфейса) все чисто виртуальные методы, которые являются частью абстрактного класса, должны быть определены (снабжены телом) в производном классе. Тогда только производный класс становится конкретным и может использоваться как тип. В противном случае он также становится абстрактным.

«Значит ли объявление метода сделать его не абстрактным?»

Не декларация, а определение . Методы уже объявлены (как чисто виртуальные) в базовом классе (интерфейсе). Предоставление им определения (тела) в производном классе делает производный класс не абстрактным (конкретным).

«Кроме того, я просто объявить его в masterApplication без фактического использования его?»

Вам нужно определить все чистые виртуальные методы базового класса в производном классе. Использовать их или нет будет зависеть от вашего прецедента.

3

Для завершения HappyCoder's answer:

Взглянув на opendnp3::IMasterApplication, вы можете увидеть, что он наследует от обоих opendnp3::ILinkListener и opendnp3::IUTCTimeSource.

В то время как первый не имеет чисто виртуальный метод, вот код второго (source):

class IUTCTimeSource 
{ 

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

Затем вам нужно перегрузить функцию Now() в классе masterApplication для того, чтобы сделать он не абстрактный.

+0

Спасибо. Это очень помогло мне. Итак, если функция является чистой виртуальной, вам нужно перегрузить ее и дать ей значение в вашей функции? –

+0

Да, чистые виртуальные средства «Я должен быть реализован в производных классах». Если вы этого не сделаете, производный класс также является абстрактным. Если вы не хотите использовать его в производном классе (который может быть признаком неправильного дизайна btw), вы можете просто сделать для него тривиальное определение, например '{return 0;}' или все, что соответствует его сигнатуре – BlackDwarf

Смежные вопросы