我只需要这样的东西:
我有一个机器人类,其中包含一个电机对象和一个预定义的回调函数(在中断时触发)。
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());
}
答案 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设计模式经常被归咎为糟糕的设计,在大多数情况下,它实际上是一个糟糕的决定。然而,有一些有效的用例,特别是在设计嵌入式系统时。你有一个单独的自主机器人,它很清楚,值得一个单身人士 但是,如果你从一开始就把自己固定在一台电机上,那就很难改变,如果硬件工程师决定需要第二台电机那么就很难改变。