我需要什么样的课堂结构?

时间:2017-10-25 12:02:48

标签: c++

我只需要这样的东西:

我有一个机器人类,其中包含一个电机对象和一个预定义的回调函数(在中断时触发)。

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
}

我想要实现的目标是:

  • 机器人和电机对象必须只创建一次(只允许一个机器人和一个电机,因为它连接到真实的物理机器人和电机),
  • 必须自动创建运动对象(motor1),最重要的是,它应该可以从预定义的callback函数中调用。

所以主要应该是这样,

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

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

1 个答案:

答案 0 :(得分:7)

不是我真的想推荐 1 ,但显然会想到Singleton Pattern

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

访问robot实例的唯一方法是使用instance()函数。

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实例的方式相同:

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

更多考虑因素:

  • 让您的robot类实现类似

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

    这样可以更容易地编写单独的单元测试并模拟robot单例。

  • 而不是static instance()函数为返回上述接口的单例实例提供全局访问函数。这也可以更容易地替换为返回模拟对象进行单元测试的函数。

1) Singleton设计模式经常被归咎为糟糕的设计,在大多数情况下,它实际上是一个糟糕的决定。然而,有一些有效的用例,特别是在设计嵌入式系统时。你有一个单独的自主机器人,它很清楚,值得一个单身人士 但是,如果你从一开始就把自己固定在一台电机上,那就很难改变,如果硬件工程师决定需要第二台电机那么就很难改变。