Я делаю приложение на 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";
}
Как я могу получить доступ к этому инициировать класс
processAImpl
и позвонитьrunAProcess
из другого класса
Я полагаю, вы хотите иллюстрировать примерами класс processAImpl
,
ProcessA
является абстрактным классом, потому что он содержит pure virtual
функция.
Когда вы наследуете от абстрактного класса, вы должны реализовать это pure virtual
функция в производном классе. В противном случае вы не сможете создать экземпляр производного класса.
Таким образом, реализовать (дать определение) runThisProcess(const std::string & str)
в производном классе processAImpl
,
Вам не хватает декларации базовых классов чисто виртуального метода 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
ничего не делает. Вы в основном получили черепахи вниз.