簡體   English   中英

使用靜態向量 C++ 跟蹤對象實例的糟糕設計?

[英]Bad design to keep track of objects instances with a static vector c++?

我正在使用的代碼是從傳感器類創建一堆對象。 當應用程序收到諸如“報告所有損壞的傳感器”之類的問題時,我將借助傳感器類中的靜態向量迭代所有傳感器對象。

public:
static std::vector<Sensor*>objList;  
bool isBroken


std::vector<Sensor*>Sensor::objList; 

Sensor::Sensor(ComponentId, component Id....){
...
objList.push_back(this);
...
}

Sensor::IsBroken(){
isBroken = adValue == broken
}

然后我們可以回復

bool Logger::BrokenSensors(std::string ComponentName){                                                                                                                                                       
    for ( auto i = Sensor::objList.begin(); i != Sensor::objList.end(); i++ ) {                                                                                                              
      if((*i)->GetStringId()==ComponentName){                                                                                                                                                                      
        return (*i)->isBroken;                                                                                                                                                                                 
      }                                                                                                                                                                                                            
    }                                                                                                                                                                                                              
 return 0;                                                                                                                                                                                                         
}  

這被認為是不好的做法嗎? 我想不出更好的方法來做到這一點。 此外,傳感器對象是從一堆不同的地方創建的。

是的,這個設計可以改進。 您應該考慮將傳感器與系統擁有的傳感器數量分開。 引入一個負責管理傳感器生命周期的SensorManager ,讓你的Sensor類只關心傳感器應該做什么。

class SensorManager
{
    // maybe use a map<sensorid, shared_ptr<Sensor>> here instead?
    vector<shared_ptr<Sensor>> sensors;
public:
    void Add( /* parameters */ )
    {
           sensors.push_back(make_shared<Sensor>( /* parameters */ ));
    }

    vector<shared_ptr<Sensor>> GetBrokenSensors()
    {
          // Your logic goes here.
    }

    void RemoveSensor( /* some sort of Id */ )
    {
          // remove this sensor from sensors.
    }

    // rest of stuff
};

我在這里留下了很多公開的細節,比如你的傳感器是共享的還是唯一的,它們的使用壽命是如何控制的,它們是如何識別的等等。

這取決於。

如果您需要定期檢查所有傳感器,那么除了像您一樣循環遍歷它們之外別無他法。

但是,如果您需要的只是發現損壞的傳感器,那么更好的模式是觀察者設計模式,它可以讓每個傳感器類在發生故障時將其報告給主要組件。

您還可以在此處找到它的 C++ 實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM