編輯:更改的問題,新的答案...
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