2009-11-19 126 views
0

我有三个类:Generic,CFG和Evaluator。这是否正确使用了dynamic_cast?

这里的通用:

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

这里的CFG:

class CFG : public virtual 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']) 

现在,有我的代码中有两个场景。一个在LCDControl类中,其中CFG的子类。另一种情况是Generic的小类EvaluatorCFG。 Evaluator有一个名为LoadPlugins的方法,它的名字就是这么做的,通过方法Connectthis传递给DLL。那么,在第一种情况下,Connect中的Generic *应该返回NULL。但是,在第二种情况下,据我所知,应该返回一个有效的指针。这似乎不是以这种方式发生的。我错了吗?

回答

2

dynamic_cast被称为突破与许多编译器(包括MSVC和gcc)模块边界。我不确切知道这是为什么,但用Google搜索会产生很多点击。我建议首先尝试摆脱dynamic_cast,而不是试图找出为什么它会在第二个场景中返回null。

+0

原来我在编译DLL的时候忘了一些源文件。我按照你的建议做了,并抛出了将PluginLCD制作成DLL并将其硬编码到程序中的想法。无论如何,它不需要处于场景1中。 – Scott 2009-11-19 11:00:13