我有几年前做过的这个C++/CLI应用程序。它有一个Engine_Base
类,它有许多不同的类,从基础继承而来,应用程序的设置用来告诉它应该使用哪个引擎。超出范围的标识符
我不得不在过去几周重构这个应用程序的一部分,现在我得到了一些非常奇怪的行为。
在设置所有组分时,有在代码的地方逻辑是实例正确的发动机:
if (this->M_ENGINE == "EngineX") {
engine_for_app = static_cast<EDI::EDI_Engine_Base^>(
gcnew EDI::EDI_Engine_EngineX(
sTemplate,
this->m_sDeliveryFilePath,
this->M_DBNAME,
this->M_DBSERVER,
this->M_CUSTOMER_ID,
Application::ExecutablePath,
this->cBoxDeliveryDateFormat->SelectedIndex,
this->M_SO_CREATION,
this->M_SO_CREATION_STATUS));
}
发动机类是在C#和它们的构造调用基发动机构造为例如:
public EDI_Engine_EngineX(String sDeliveryTemplatePath, String sDeliveryFilePath, String sDbName, String sDbServer, String sCustId, String sAppPath, int iDelDateFormat, String sSOCreation, String sSOCreationStatus)
: base(sDbName, sDbServer, sCustId, sAppPath, sSOCreation, sSOCreationStatus)
{
//...Stuff that this particular engine needs to set...
}
这会发送执行到发动机基类的构造函数:
EDI_Engine_Base::EDI_Engine_Base(String^ sDbName, String^ sDbServer, String^ sCustId,
String^ sAppPath, String^ sSOCreation, String^ sSOCreationStatus)
{
//...yada yada yada setting stuff in the base class...
}
好的...对不起,花了这么长的时间才明白这一点,但所有的作品都已经到位了。
我得到的问题是,直到执行到基类构造函数,所有的参数都没问题。我的意思是它们被实例化和填充。当我到达基类构造函数时,字符串sDbServer甚至没有实例化。当我尝试快速观看时,我会看到“标识符超出范围”。
考虑到它是一个简单的字符串,它与sDbName同时被实例化,带有断点的我已验证该值被传递给实例类,并且此时基础构造函数的值仍然那里。我根本不明白发生了什么事。
所有这些工作一直持续到昨天,但我没有触及此代码。
任何人都有关于发生了什么的想法或理论?
编辑:我找到了答案。
删除了C#标记。 – tnw 2013-05-01 14:36:57
为什么在引擎类是C#时删除C#标记?这可能是相关的。 – 2013-05-01 14:48:58
我的错误。没有仔细阅读 - 很抱歉。重新添加。 – tnw 2013-05-01 14:50:56