编辑:更改的问题,新的答案...
SensorOverLimit.h:
class SensorOverLimit
{
bool* sensor;
public:
SensorOverLimit(bool* sensorAddress);
void check();
};
SensorOverLimit.cpp:
SensorOverLimit::SensorOverLimit(bool* sensorAddress)
: sensor(sensorAddress)
{
}
void SensorOverLimit::check()
{
if(*sensor)
{
somefunction();
}
}
查看 Remy 的引用而不是指针的答案(bool& 而不是 bool*,您可以省略取消引用 (if(sensor))
main.cpp:
HeatSensor heatSensor;
LeftLegSensor leftLegSensor;
SensorOverLimit overHeating(&heatSensor.isOverheating);
SensorOverLimit leftLegDamaged(&leftLegSensor.isStalled);
int main(int, char*[])
{
// ...
return 0;
}
您可能已经注意到:我直接实例化了全局变量。这在嵌入式环境中通常更合适,至少更易于使用。
注意以下划线开头的标识符 - 这些标识符在许多情况下是保留的(C++ 标准,2.10):
每个包含双下划线 __ 或以下划线后跟大写字母的标识符都保留给实现以供任何使用。
每个以下划线开头的标识符都保留给实现,用作全局命名空间中的名称。
编辑 2:
我想出了一个完全不同的设计,颠倒你目前的设计:
class Sensor
{
public:
Sensor()
: isActive(false)
{ }
virtual ~Sensor()
{ }
void check()
{
if(getValue() != isActive)
{
isActive = !isActive;
if(isActive)
{
someFunction();
}
}
}
private:
bool isActive;
virtual bool getValue() = 0;
};
class HeatSensor : public Sensor
{
virtual bool getValue()
{
bool isActive = false;
// do what ever is necessary to detect overheat
// e. g. read from ADC and compare against threshold
return isActive;
}
};
class LegSensor : public Sensor
{
bool isSignal;
virtual bool getValue()
{
// do what ever is necessary to detect stalled leg
// e. g.: simply returning the value that has been set from
// within an interrupt handler
return isSignal;
}
};
对我成员的名字不太满意,你可能会找到更好的...
但是,您对此设计的意图是什么?你要遍历每个城市,检查布尔指针吗?对我来说似乎是一个有问题的设计......
我为你推荐一个替代方案:
每个传感器都有一个 SensorOverLimit* 指针,您可以将其称为“控制器”或任何您认为合适的名称。然后为每个 Sensor 类添加函数:oveheating()、stalling() 等。在这些函数中,您调用新定义的 SensorOverLimit 函数:disturb(int reason, Sensor* source)。您可以定义一个包含所有可能原因(例如过热、失速等)的枚举,而不是 int。
可能是这样的:
class Sensor;
class SensorOverLimit
{
// appropriate members
public:
enum Disturbance
{
Overheat,
Stall,
};
SensorOverLimit() {}
void disturb(Disturbance reason, Sensor* source)
{
someFunction();
}
};
class Sensor
{
protected:
SensorOverLimit* controller;
public:
// ctor, getters, setters as needed
Sensor(SensorOverLimit* aController) : controller(aController) {}
};
class HeatSensor : public Sensor
{
public:
// ctor, getters, setters as needed
HeatSensor(SensorOverLimit* aController) : Sensor(aController) {}
void overheating()
{
if (controller)
controller->disturb(SensorOverLimit::Overheat, this);
}
};
class LegSensor : public Sensor
{
public:
// ctor, getters, setters as needed
LegSensor(SensorOverLimit* aController) : Sensor(aController) {}
void stalling()
{
if (controller)
controller->disturb(SensorOverLimit::Stall, this);
}
};
SensorOverLimit controller;
HeatSensor heatSensor(&controller);
LegSensor leftLegSensor(&controller);
int main(int, char*[])
{
// ...
heatSensor.overheating();
//...
leftLegSensor.stalling();
//...
return 0;
}
优势:您可以将多个传感器关联到同一个控制器。