2013-05-01 26 views
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同时被实例化,带有断点的我已验证该值被传递给实例类,并且此时基础构造函数的值仍然那里。我根本不明白发生了什么事。

所有这些工作一直持续到昨天,但我没有触及此代码。

任何人都有关于发生了什么的想法或理论?

编辑:我找到了答案。

+0

删除了C#标记。 – tnw 2013-05-01 14:36:57

+0

为什么在引擎类是C#时删除C#标记?这可能是相关的。 – 2013-05-01 14:48:58

+1

我的错误。没有仔细阅读 - 很抱歉。重新添加。 – tnw 2013-05-01 14:50:56

回答

0

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

我会想到这种错误被编译器捕获,但我想他们不是。

+0

编译器只会查看您的源代码,而不是您的监视表达式。与大多数重构工具一样。所以是的,监视表达式很容易因重构而失效。 – 2013-05-01 16:27:46