编辑:更改的问题,新的答案...
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();
}
}
看一看雷米的回答为参考,而不是指针(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 *指针,你可以把它叫做“控制器”或什么的似乎是适当的给你。然后为每个传感器类添加功能: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;
}
优点:您可以将多个传感器关联到同一个控制器。
哪本书你从这个学习? – Nim
另外,你为什么要通过“打扰”作为指针?如果你只需要'City :: City(bool Disturb)',问题就简单多了。 – kfsone
人物和动物物体在其各自的人物和动物类别中具有各自的属性。 kfsone,我可以做_person.IsDead并将其保存到我的迈阿密对象中的成员? – LilProgramma