2009-05-22 4 views
0

데이터 처리를 위해 엔진을 개발해야하는 애플리케이션을 작성하고 있지만 고객의 필요에 따라 엔진을 다른 것으로 대체 할 수 있어야했습니다. 각 고객마다 매우 다른 요구가 있었기 때문에 각 엔진을 다른 엔진과 분리하여 고객이 필요로하는 엔진으로 만 응용 프로그램을 제공 할 수있게하려고했습니다.부모 클래스로 자식 클래스 인스턴스화하기, 자식 메소드 호출하기

그래서 내 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의 접근 방식은 괜찮습니까? 아니면 다른 것을보고 다른 방식으로 처리해야합니까?

+0

C++에서이 문제를 재현 할 수 없습니다. 가상 메소드와 두 개의 파생 클래스로 추상 기본 클래스를 만들었습니다. 그런 다음 파생 클래스를 인스턴스화하고 가상 메서드의 기반을 가리키는 대리자를 실행하는 데 사용한 구문과 동일한 구문을 사용할 수 있습니다. Engine_Base, Engine_A 및 Engine_B의 정의에서 관련 부분을 게시 할 수 있습니까? –

+0

이것은 관리되는 C++이며 함수를 가상으로 표시해도 동작에 아무런 영향을 미치지 않습니다. 기본 클래스를 가상으로 표시하면 다음 오류가 발생합니다. 오류 오류 C2889 : 'Engine_Base': 관리되는 클래스 유형이 가상 기본 클래스가 될 수 없음 –

답변

0

편집 : Engine_A 등의 메소드가 가상으로 표시되어 있는지 확인하십시오.

+0

사용중인 엔진이 동적이며 기본 클래스로 지정되어야합니다. 암호. –

+0

알았습니다. 메서드가 가상으로 표시되어 있는지 확인 하시겠습니까 ?? – PiNoYBoY82

+0

함수를 가상으로 표시해도 동작에는 영향을주지 않습니다. 기본 클래스를 가상으로 표시하면 다음 오류가 발생합니다. 오류 오류 C2889 : 'Engine_Base': 관리되는 클래스 유형이 가상 기본 클래스가 될 수 없습니다. –

관련 문제