【问题标题】:Pass and store interface implementation传递和存储接口实现
【发布时间】:2016-05-15 08:29:14
【问题描述】:

假设我们有接口 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。我能用它做什么?

【问题讨论】:

    标签: c++ interface parameter-passing pass-by-reference


    【解决方案1】:

    如果您是创建 selector_interface_t 类型的人,那么您可以将其存储在 shared_ptr 中,并让 myclass_t 类为接口保存一个 weak_ptr 或 shared_ptr。

    如果您不是创建 selector_interface_t 的人,那么我假设您还有其他方法可以使对象保持活动状态,请将其包装在一个管理生命周期的类中,并将该对象包装在 shared_ptr 中。

    【讨论】:

      【解决方案2】:

      如果您不能保证实现具有正确的生命周期,那么您需要管理它,这意味着动态分配它。 (使用new,而不是malloc。)

      我强烈建议使用shared_ptr<selector_interface_t>unique_ptr<selector_interface_t> - 取决于您是否想要在客户端之间共享实现对象。然后,您可以轻松获得正确的代码。

      【讨论】:

        猜你喜欢
        • 2020-05-20
        • 1970-01-01
        • 2017-11-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-03
        • 2015-02-13
        • 1970-01-01
        相关资源
        最近更新 更多