0

我有几年前制作的这个 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 同时被实例化,我通过断点验证了该值已传递给实例类,并且在基本构造函数的那一刻,该值仍然存在。我完全不明白发生了什么事。

所有这一切都在昨天工作,但我还没有接触过这段代码。

有人对正在发生的事情有想法或理论吗?

编辑:我找到了答案。

4

1 回答 1

0

参数的名称在重构中已更改,并且构造函数定义(在 .h 中)为此参数具有不同的名称,从而导致运行时错误。

我原以为编译器会捕捉到这种错误,但我想它们不是。

于 2013-05-01T15:45:55.687 回答