在我当前的代码中,我有一个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>的东西?

最佳答案

如果使用该方法,则每个派生类将具有自己的唯一基类。即使它们具有相同的名称,它们也将是不同的实例。您确定让基类继承自enable_shared_from_this不会为所有子项提供此功能吗?

另外,which will share a lot of code with the existing ... class.并不是使用继承的直接指示器。通常,继承是扩展,而不是重用。如果所有基类都实现了通用功能,但没有为这两个类提供通用接口(interface),则您可能应该重新考虑该方法。可以使用组合和委托(delegate)通用方法,或者,如果它们不具有连续状态,则将通用代码放入(可能是匿名的) namespace 中,并从所需的实际功能类中调用它们。您没有提供足够的信息来确定您要尝试执行的操作。

关于c++ - CRTP模式和enable_shared_from_this,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/9081029/

10-10 10:05