2009-05-22 12 views
0

私は、データを処理するためのエンジンの開発を必要とするアプリケーションを作成していますが、顧客のニーズに応じてエンジンを別のものに置き換える必要がありました。各顧客は非常に異なるニーズを持っていたため、各エンジンを他のエンジンと分離して、顧客が必要とするエンジンでのみアプリケーションを提供できるようにしたいと考えました。子クラスを親としてインスタンス化するが、子メソッドを呼び出す

だから私のVSソリューションは、以下のプロジェクトを持っている:アプリケーション、Engine_Base、Engine_A、Engine_B アプリケーションは、exeファイル Engine_Baseは、親クラスを= = ... dllファイルにコンパイルし、projecを通じてアプリケーションの参照に追加されますプロパティ Engine_AとEngine_BはどちらもEngine_Baseの子クラスであり、どちらも独自のdll(Engine_A.dll、Engine_B.dll)にコンパイルされます。それらは、アプリケーションの参照に追加されないため、ランタイムにロードされません。これは、両方の顧客に両方を出荷する必要がないためです。唯一Engine_Baseは、私たちは親の型に当社Engine__AまたはEngine_Bオブジェクトをキャスト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_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 

私はこれが継承と関係していることを認識していますが、これを修正する方法のアイデアは不足しています。

これを修正する方法はありますか?

私たちのアプローチは正しい解決策ですか、それとも別のものを見て違ったことをしていたはずですか?

+0

この問題はC++では再現できません。私は、仮想メソッドと2つの派生クラスを持つ抽象基本クラスを作成しました。次に、派生クラスをインスタンス化し、仮想メソッドの基底を指すデリゲートを実行するために使用したのと同じ構文を使用できます。 Engine_Base、Engine_A、およびEngine_Bの定義の関連部分を転記できますか? –

+0

これはC++で管理されており、仮想として機能をマークしても動作に影響はありません。 エラーエラーC2889: 'Engine_Base':管理対象クラスの型を仮想基本クラスにすることはできません –

答えて

0

編集:Engine_Aなどのメソッドにバーチャルマークが付いていることを確認してください。

+0

使用されているエンジンは動的で、ベースクラスとして指定する必要があります。コード。 –

+0

入手しました。メソッドにバーチャルマークが付いていることを確認しますか? – PiNoYBoY82

+0

関数を仮想としてマークしても、動作には何の影響もありませんでした。 エラーエラーC2889: 'Engine_Base':管理対象クラスの型を仮想基本クラスにすることはできません –

関連する問題