Ошибка C++ / Djinni Тип поля - абстрактный класс

Я делаю приложение на React-native, которое использует Djinni из Dropbox для связи между C++ и Javascript. Вызов из Javascript в C++ работает хорошо, но сейчас я реализую Call из C++ в Java / ObjC, мои навыки в C++ такие-то и такие-то. Так что я застрял на инициализации метода класса. Я основываюсь на примере Джинни. AnotherClassMain - это точка доступа от Javascript до C++.

Я хочу вызвать метод runAProcess из processAImpl внутри anotherClassMain.

Но я получаю сообщение об ошибке Тип поля 'aEditing::ProcessAImpl' является абстрактным классом На линии ProcesAImpl processA; в anotherClassMain.hpp

Как я могу получить доступ к этому инициировать класс processAImpl и вызвать runAProcess из anotherClassMain??

// processA.hpp создан Джинни

#pragma once
#include <string>

namespace aEditing {
class ProcessA {
public:
    virtual ~ProcessA() {}
    virtual bool runThisProcess(const std::string & str) = 0;
};
} 

//processAImpl.hpp

#pragma once
#include "processA.hpp"

namespace aEditing {
class ProcessAImpl : public ProcessA {

public:
    ProcessAImpl(const std::shared_ptr<ProcessA> & listener);
    void runAProcess(const std::string aCommand);

private:
    std::shared_ptr<ProcessA> aProcess;
};
}

//processAImpl.cpp

#include "procesAImpl.hpp"
namespace aEditing {

ProcessAImpl::ProcessAImpl (const std::shared_ptr<ProcessA> & listener) {
    this->aProcess = listener;
}

void ProcessAImpl::runAProcess(const std::string aCommand) {
    this->aProcess->runThisProcess(aCommand);
}
}

//anotherClassMain.hpp

#pragma once
#include "includes.hpp"
#include "processAImpl.hpp"

namespace anotherProcessing {

  class AnotherProcessingMain: public anotherProcessing::AnotherProcessing {
    public:
      AnotherProcessingMain();
      string anotherProcessing(const std::string &Input, const std::string &output) override;
    private:
        ProcesAImpl  processA;
  };
}

//anotherClassMain.cpp

#include "anotherClassMain.hpp"

namespace anotherProcessing {
  shared_ptr<AnotherProcessing> AnotherProcessing::create() {
    return make_shared<AnotherProcessingMain>();
  }

  AnotherProcessingMain::AnotherProcessingMain() {}

  string AnotherProcessingMain::anotherProcessing(const std::string &Input, const std::string &output){

    processA.runAProcess("testCommand");  //Trying to access this!

    return "yeah";
  }

2 ответа

Вам не хватает декларации базовых классов чисто виртуального метода bool runThisProcess(const std::string &), Вы имели в виду для void ProcessAImpl::runAProcess(const string) быть реализацией?

Типы имени и аргумента должны точно соответствовать

  • runThisProcess против runAProcess
  • const std::string & против const string

Вы должны пометить методы в подклассе, которые вы собираетесь переопределять методы базового класса, как override (если могут быть занятия внуков) или final (если нет), чтобы компилятор мог лучше информировать вас о таких опечатках

Вам также не хватает инициализации AnotherProcessingMain::processA, Вам нужно что-то вроде

AnotherProcessingMain::AnotherProcessingMain()
  : processA(/* a const std::shared_ptr<ProcessA> & from somewhere */) 
{}

потому что единственный конструктор для ProcessAImpl вы определили занимает const std::shared_ptr<ProcessA> &,

Это очень подозрительно, что у вас есть ProcessAImpl иметь std::shared_ptr<ProcessA> член. Там должен быть какой-то класс, который на самом деле делает вещи в этом runThisProcess член, и это, вероятно, должно быть ProcessAImpl, Как это в настоящее время стоит, ProcessAImpl ничего не делает У вас в основном все черепахи внизу.

Как я могу получить доступ к этому инициировать класс processAImpl и позвонить runAProcess из другого класса

Я полагаю, вы хотите создать экземпляр класса processAImpl,
ProcessA является абстрактным классом, потому что он содержит pure virtual функция.
Когда вы наследуете абстрактный класс, вы должны реализовать pure virtual функция в производном классе. В противном случае вы не сможете создать экземпляр производного класса.

Таким образом, реализовать (дать определение) runThisProcess(const std::string & str) в производном классе processAImpl,

Другие вопросы по тегам