我有幾年前做過的這個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同時被實例化,帶有斷點的我已驗證該值被傳遞給實例類,並且此時基礎構造函數的值仍然那裏。我根本不明白髮生了什麼事。
所有這些工作一直持續到昨天,但我沒有觸及此代碼。
任何人都有關於發生了什麼的想法或理論?
編輯:我找到了答案。
刪除了C#標記。 – tnw 2013-05-01 14:36:57
爲什麼在引擎類是C#時刪除C#標記?這可能是相關的。 – 2013-05-01 14:48:58
我的錯誤。沒有仔細閱讀 - 很抱歉。重新添加。 – tnw 2013-05-01 14:50:56