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

+0

엔진 클래스가 C# 일 때 C# 태그를 제거하는 이유는 무엇입니까? 이것은 관련 될 수 있습니다. –

+1

내 실수. 사과를 충분히 신중하게 읽지 않았습니다. 다시 추가되었습니다. – tnw

답변

0

리팩토링에서 매개 변수의 이름이 변경되었으며 런타임 오류를 유발 한이 매개 변수의 이름이 .h의 생성자 정의와 달라졌습니다.

나는 이런 종류의 오류가 컴파일러에 의해 잡힐 것이라고 생각했지만 그렇지 않다고 생각합니다.

+0

컴파일러는 시계식이 아닌 소스 코드 만 봅니다. 대부분의 리팩토링 도구와 동일합니다. 그렇습니다. 리팩토링으로 인해 표현식이 유효하지 않게되는 것은 쉽습니다. –

관련 문제