데이터 처리를 위해 엔진을 개발해야하는 애플리케이션을 작성하고 있지만 고객의 필요에 따라 엔진을 다른 것으로 대체 할 수 있어야했습니다. 각 고객마다 매우 다른 요구가 있었기 때문에 각 엔진을 다른 엔진과 분리하여 고객이 필요로하는 엔진으로 만 응용 프로그램을 제공 할 수있게하려고했습니다.부모 클래스로 자식 클래스 인스턴스화하기, 자식 메소드 호출하기
그래서 내 VS 솔루션은 다음과 같은 프로젝트가 : 응용 프로그램, Engine_Base, Engine_A, Engine_B 앱이 Engine_Base 상위 클래스 = EXE 파일을 =을 ... dll을로 컴파일하고 projec을 통해 앱의 참조에 추가 속성 Engine_A와 Engine_B는 모두 Engine_Base의 하위 클래스이며 둘 다 자신의 dll (Engine_A.dll, Engine_B.dll)로 컴파일됩니다. 그것들은 App의 참조에 추가되지 않기 때문에 런타임에로드되지 않을 것입니다. 왜냐하면 우리는 우리 고객 모두에게 배송되기를 원하지 않기 때문입니다. 우리가하는 엔진 부하로 결정하는 고객의 구성 파일을 기반으로
은 : 오직 때문에 Engine_Base는 C++ 프로젝트의 참조에 추가됩니다Engine_Base^ engine_for_app;
Assembly^ SampleAssembly;
Type^ engineType;
if (this->M_ENGINE == "A")
{
SampleAssembly = Assembly::LoadFrom("path\\Engine_A.dll");
engineType = SampleAssembly->GetType("Engine_A");
engine_for_app = static_cast<Engine_Base^>(Activator::CreateInstance(engineType, param1, param2));
}
else
{
SampleAssembly = Assembly::LoadFrom("path\\Engine_B.dll");
engineType = SampleAssembly->GetType("Engine_B");
engine_for_app = static_cast<Engine_Base^>(Activator::CreateInstance(engineType, param1, param2, param3, param4));
}
우리는 우리의 Engine__A 또는 Engine_B 부모 유형으로 개체를 캐스팅. 그들은 (프로세스 많은 데이터)를 실행하는 데 시간이 오래 걸릴
그런 다음 우리는 우리의 엔진의 스레드 실행을 위해 이벤트를 설정합니다engine_for_app->OnComplete += gcnew CompleteEngineProcess(this, &frmMain::ThreadChildComplete);
engine_for_app->OnProgressInit += gcnew ProgressInitEngine(this, &frmMain::ThreadChildProgressInit);
engine_for_app->OnProgressReport += gcnew ProgressReportEngine(this, &frmMain::ThreadChildProgressReport);
Thread^ aThread;
aThread = gcnew Thread(gcnew ThreadStart(engine_for_app, &Engine_Base::Read));
을하지만이 나에게 제공합니다
Error 2 error C3754: delegate constructor: member function 'Engine_A::Read' cannot be called on an instance of type 'Engine_Base ^' d:\_activeWork\EDI_TRUNK\src\App\frmMain.cpp 492
을
저는 이것이 상속과 관련이 있다는 것을 알고 있습니다. 그러나이 문제를 해결하는 방법에 대한 아이디어는 부족합니다.
이 문제를 해결하는 방법에 대한 아이디어가 있습니까?
Google의 접근 방식은 괜찮습니까? 아니면 다른 것을보고 다른 방식으로 처리해야합니까?
C++에서이 문제를 재현 할 수 없습니다. 가상 메소드와 두 개의 파생 클래스로 추상 기본 클래스를 만들었습니다. 그런 다음 파생 클래스를 인스턴스화하고 가상 메서드의 기반을 가리키는 대리자를 실행하는 데 사용한 구문과 동일한 구문을 사용할 수 있습니다. Engine_Base, Engine_A 및 Engine_B의 정의에서 관련 부분을 게시 할 수 있습니까? –
이것은 관리되는 C++이며 함수를 가상으로 표시해도 동작에 아무런 영향을 미치지 않습니다. 기본 클래스를 가상으로 표시하면 다음 오류가 발생합니다. 오류 오류 C2889 : 'Engine_Base': 관리되는 클래스 유형이 가상 기본 클래스가 될 수 없음 –