この記事は2020年06月09日に投稿しました。
目次
リンク
1. はじめに
こんにちは、iOSのエディタアプリPWEditorの開発者の二俣です。
今回は業務で使用しているC++/CLIで状態遷移処理を行う方法についてです。
2. C++/CLIで状態遷移処理を行う
C++/CLIで状態遷移処理を行うには、以下のような実装にします。
実装例
main.cpp
using namespace System; using namespace System::Collections::Generic; ref class StateProc { private: // 状態文字列 static initonly String^ StateA = "StateA"; static initonly String^ StateB = "StateB"; static initonly String^ StateC = "StateC"; public: /** * @brief コンストラクタ */ StateProc() { // 状態処理テーブルを生成し、設定します。 mStateProcTable = gcnew Dictionary<String^, StateProcDelegate^>(); mStateProcTable->Add(StateA, gcnew StateProcDelegate(this, &StateProc::StateAProc)); mStateProcTable->Add(StateB, gcnew StateProcDelegate(this, &StateProc::StateBProc)); mStateProcTable->Add(StateC, gcnew StateProcDelegate(this, &StateProc::StateCProc)); // 初期状態を設定します。 SetState(StateA); } /** * @brief 状態処理を行います。 * * @param [in] message メッセージ */ void ExecStateProc(String^ message) { auto stateProc = mStateProcTable[mState]; stateProc(message); } private: //! 状態 String^ mState; //! 状態処理を行うデリゲート定義 delegate void StateProcDelegate(String^ message); //! 状態処理テーブル Dictionary<String^, StateProcDelegate^>^ mStateProcTable; /** * @brief 状態Aの処理を行ないます。 * * @param [in] message メッセージ */ void StateAProc(String^ message) { Console::WriteLine("StateAProc:" + message); // メッセージにより状態を変更します。 if (message->Equals("B")) { SetState(StateB); } else { SetState(StateC); } } /** * @brief 状態Bの処理を行ないます。 * * @param [in] message メッセージ */ void StateBProc(String^ message) { Console::WriteLine("StateBProc:" + message); // メッセージにより状態を変更します。 if (message->Equals("C")) { SetState(StateC); } else { SetState(StateA); } } /** * @brief 状態Cの処理を行ないます。 * * @param [in] message メッセージ */ void StateCProc(String^ message) { Console::WriteLine("StateCProc:" + message); // メッセージにより状態を変更します。 if (message->Equals("A")) { SetState(StateA); } else { SetState(StateB); } } /** * @brief 状態を設定します。 * * @param [in] state 状態 */ void SetState(String^ state) { mState = state; } }; int main() { auto stateProc = gcnew StateProc(); stateProc->ExecStateProc("B"); stateProc->ExecStateProc("C"); stateProc->ExecStateProc("X"); stateProc->ExecStateProc("X"); stateProc->ExecStateProc("X"); Console::ReadKey(); return 0; }
実行結果
StateAProc:B StateBProc:C StateCProc:X StateBProc:X StateAProc:X
3. おわりに
C++/CLIの業務アプリの通信処理で状態遷移処理を使っている個所がありました。
状態遷移処理はあまりやったことが無かったため、勉強のためサンプル実装してみました。
全体的には大がかりな感じですが、個々の処理は小さくなるので、その点では見通しがよい気がします。
リンク
紹介している一部の記事のコードはGitlabで公開しています。
興味のある方は覗いてみてください。
私が勤務しているニューラルでは、主に組み込み系ソフトの開発を行っております。
弊社製品のハイブリッドOS Bi-OSは高い技術力を評価されており、特に制御系や通信系を得意としています。
私自身はiOSモバイルアプリやウィンドウズアプリを得意としております。
ソフトウェア開発に関して相談などございましたら、お気軽にご連絡ください。
また一緒に働きたい技術者の方も随時募集中です。
興味がありましたらご連絡ください。
EMAIL : info-nr@newral.co.jp / m-futamata@newral.co.jp
TEL : 042-523-3663
FAX : 042-540-1688