我有几年前制作的这个 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 同时被实例化,我通过断点验证了该值已传递给实例类,并且在基本构造函数的那一刻,该值仍然存在。我完全不明白发生了什么事。
所有这一切都在昨天工作,但我还没有接触过这段代码。
有人对正在发生的事情有想法或理论吗?
编辑:我找到了答案。