2016-05-15 72 views
0

我們假設我們有接口selector_interface_t和此接口的實現pin_selector_t傳遞和存儲接口實現

class selector_interface_t 
{ 
    public: 
     virtual void select(uint8_t address) = 0; 
     virtual void deselect() = 0; 
}; 

class pin_selector_t : public selector_interface_t 
{ 
    private: 
     uint8_t mask; 

    public: 
     pin_selector_t(uint8_t mask); 
     void select(uint8_t address); 
     void deselect(); 
}; 

而現在我們想傳遞對象巫實現了這個接口myclass_t類和存儲以備將來使用其它myclass_t方法(如:strobe)。

class myclass_t 
{ 
    private: 
     selector_interface_t * selector; 

    public: 
     myclass_t(selector_interface_t & selector); 
     void strobe(uint8_t pin); 
}; 

myclass_t::myclass_t(selector_interface_t & selector) // : selector(selector) 
{ 
    // ... 
} 

void myclass_t::strobe(uint8_t pin) 
{ 
    this->selector->select(pin); 
    this->selector->deselect(); 
} 

唯一的方法是通過指針或引用傳遞實現。我更喜歡第二種解決方案,並通過參考。但是我不能簡單地將這個引用存儲在myclass_t對象中,因爲對象的生存期和接口實現。複製一下會更好。但我不能有selector_interface_t現場成員。我只能有這種類型的引用或指針。另一方面,我想避免使用malloc。我能用它做什麼?

回答

1

如果您是創建selector_interface_t類型的人,那麼您可以將其存儲在shared_ptr中,並讓myclass_t類將weak_ptr或shared_ptr保存到接口。

如果您不是創建selector_interface_t的人,那麼我假設您有其他方法來保持該對象的活動狀態,將其包裝在管理生命週期的類中,並將該對象包裝在shared_ptr中。

0

如果你不能保證實現具有正確的生命週期,那麼你需要管理它,這意味着動態分配它。 (使用new,不malloc

我強烈建議使用任何shared_ptr<selector_interface_t>unique_ptr<selector_interface_t> - 這取決於你是否沒有想客戶端之間共享的實施對象。然後您可以很輕鬆地獲得正確的代碼。