0

Generic、CFG、および Evaluator の 3 つのクラスがあります。

一般的なものは次のとおりです。

class Generic: public virtual Evaluator, public CFG, public LCDInterface {

CFG は次のとおりです。

class CFG : public virtual Evaluator {

Evaluator は何もサブクラス化しません。

PluginLCD という名前の DLL を提供しています。これには Connect というメソッドがあります。

void PluginLCD::Connect(Evaluator *visitor) {
    visitor_ = dynamic_cast<Generic *>(visitor);
    if(!visitor_)
        return;
    type_ = visitor_->GetType();
}

scons を使用して DLL をコンパイルする方法は次のとおりです。

env.SharedLibrary(['PluginLCD.cpp', 'Evaluator.cpp', 'Generic.cpp', 'CFG.cpp'])

さて、私のコードには 2 つのシナリオがあります。1 つはクラスLCDControl内にあり、サブクラスCFGです。もう 1 つのシナリオは、上記のGenericサブクラスEvaluatorCFG. Evaluator には LoadPlugins というメソッドがあり、その名前が示すように、thisメソッドを介して DLLに渡されますConnect。最初のシナリオではGeneric *、Connect のキャストは を返す必要がありますNULL。ただし、2 番目のシナリオでは、私の知る限り、有効なポインターが返されるはずです。このようには起こっていないようです。私はこれについて間違っていますか?

4

1 に答える 1

2

dynamic_castは、多くのコンパイラ(MSVCやgccを含む)でモジュールの境界を越えることが知られています。それがなぜなのか正確にはわかりませんが、グーグルで検索すると多くのヒットが発生します。2番目のシナリオでnullを返す理由を調べるのではなく、最初にdynamic_castを削除することをお勧めします。

于 2009-11-19T10:46:48.713 に答える