CRTP模式和enable_shared_from_this

时间:2012-01-31 14:16:31

标签: c++ design-patterns boost shared-ptr

在我目前的代码中,我有一个TNCPConnection类,它派生自enable_shared_from_this

class TNCPConnection : public boost::enable_shared_from_this<TNCPConnection> { ... };

现在我需要创建第二个类ETCPConnection,它将与现有的TNCPConnection类共享大量代码。因此,显而易见的解决方案是使用抽象基类CPConnectionBase来实现常用功能。

我知道继承层次结构中只有一个类可以派生自enable_shared_from_this。在寻找解决方案时,我偶然发现了CRTP模式,但我不确定我是否正确理解了这一点。这是我的方法:

template <class Derived>
class CPConnectionBase : public boost::enable_shared_from_this<Derived>
{
public:

    CPConnectionBase(void) { }
    virtual ~CPConnectionBase(void) = 0 { }
};

class TNCPConnection : public CPConnectionBase<TNCPConnection> { ... };

class ETCPConnection : public CPConnectionBase<ETCPConnection> { ... };

这是解决问题的正确方法吗?使用这种方法可以正确引用计数吗?特别是我想知道enable_shared_from_this的模板参数是否必须是Derived(如上例所示)或CPConnectionBase<Derived>之类的内容?

1 个答案:

答案 0 :(得分:2)

如果使用该方法,则每个派生类都将拥有自己的唯一基类。尽管它们具有相同的名称,但它们将是不同的实例。您确定从enable_shared_from_this继承的基类不会为所有孩子提供这种能力吗?

此外,which will share a lot of code with the existing ... class. 是使用继承的直接指标。一般来说,继承要扩展,而不是重用。如果所有基类都实现了通用功能,但没有为这两个类提供通用接口,那么您应该重新考虑这种方法。使用组合和委托到公共方法,或者,如果它们没有连续状态,则将公共代码放入(可能是匿名的)名称空间,并从您需要的实际功能类中调用它们。您没有提供足够的信息来确定您正在尝试做什么。