2016-05-15 52 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> - 这取决于你是否没有想客户端之间共享的实施对象。然后您可以很轻松地获得正确的代码。