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 に答える