2013-05-01 45 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