我有几年前制作的这个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同时实例化,使用断点我已验证该值是否传递给实例类,而且基本构造函数的值仍然存在。我根本不明白发生了什么。
所有这些工作一直持续到昨天,但我没有触及此代码。
任何人都有关于发生了什么的想法或理论?
编辑:我找到了答案。答案 0 :(得分:0)
参数的名称在重构中已更改,构造函数定义(在.h中)具有此参数的不同名称,这导致运行时错误。
我原以为编译器会抓住这种错误,但我猜他们不是。