2017-10-25 9 views
2

私はこれで初めてです。どのようなクラス構造が必要ですか?

私はモーターオブジェクトと定義済みのコールバック関数(割り込みでトリガーされる)を含むロボットクラスを持っています。私はachiveしようとしています何

robot.h

class robot 
{ 
public: 
    motor motor1; 
}; 

motor.h

class motor 
{ 
public: 
    int incrementPosition(); 
    int getPosition(); 
private: 
    int position; 
}; 

callback.cpp

void callback(){ 
    motor1.incrementPosition(); //callback function needs to reach this already created motor1 
} 

は次のとおりです。

  • ロボットとモーターオブジェクトは一度作成する必要があります(実際の物理ロボットとモーターに接続されているため、1つのロボットと1つのモーターのみが許容されます)
  • モーターオブジェクト(motor1)は、重要なことは、あらかじめ作成されたcallback関数から呼び出すことができるはずです。

だから、メインは、私は本当にことをお勧めしたいが、明らかにSingleton Patternが頭に浮かぶことはない

main(){ 
    robot myRobot; 
    robot myRobot2; //is not allowed or should be useless 

    printf("%d\n", myRobot.motor1.getPosition()); 
} 
+0

コールバック関数のユーザーパラメータをインストールできますか? – user0042

+0

[This](https://stackoverflow.com/questions/1008019/c-singleton-design-pattern)が役立ちます。 –

+1

"GetOrCreate"関数のようなものを書くことができますか? 'ロボット'は何かによって管理されるべきですか? – George

答えて

7

、次のようにする必要があります:

class robot { 
    robot() {} 
public: 
    motor motor1; 
    static robot& instance() { 
     static robot theRobot; 
     return theRobot; 
    } 
}; 

のみ方法はrobotinstance()関数を使用することです。

main(){ 
    robot myRobot; // Fails to compile since the constructor is private 

    printf("%d\n", robot::instance().motor1.getPosition()); 
       // ^^^^^^^^^^^^^^^^^ Access the one and only instance 
} 

単一motorインスタンスは、コールバック関数にアクセスすることができるのと同じ方法:

  • は、あなたのrobotクラスがインタフェースを実装してください:

    void callback(){ 
        robot::instance().motor1.incrementPosition(); 
    } 
    

    いくつかのより多くの考慮事項like

    struct IRobot { 
        virtual ~IRobot() {} 
        virtual std::vector<std::shared_ptr<IMotor>>& motors() = 0; 
    }; 
    

    これにより、分離された単体テストを作成し、シングルトンrobotをモックするのが簡単になります。

  • 上記のインターフェイスを返すシングルトンインスタンスのグローバルアクセス機能を提供するために、staticinstance()関数に代わるものです。これは単体テスト用のモックオブジェクトを返す関数に置き換えるのが簡単です。


1)シングルトンデザインパターンは、多くの場合、悪いデザインとして非難し、ほとんどの場合、それは実際に悪い決断です。それにもかかわらず、特に組み込みシステムを設計する際には、有効なユースケースがあります。あなたは単一の自律型ロボットを持っていますが、それは明確でシングルトンに値するものです。
最初から1台のモーターに自分自身を固定する必要がある場合は、HWエンジニアが2台目のモーターを必要とすると変更するのは難しいでしょう。

関連する問題