Ошибка C ++ / Djinni Тип поля - абстрактный класс - PullRequest
0 голосов
/ 06 декабря 2018

Я делаю приложение на 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, созданного djinni

#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 ]

0 голосов
/ 06 декабря 2018

Вам не хватает объявления базовых классов чисто виртуального метода 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 ничего не делает .В основном у вас есть черепахи вплоть до .

0 голосов
/ 06 декабря 2018

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

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

Поэтому внедрите (предоставьте определение) runThisProcess(const std::string & str) в производном классе processAImpl.

...