c++ - CRTP 模式和 enable_shared_from_this

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

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

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

现在我需要创建第二个类 ETCPConnection这将与现有的 TNCPConnection 共享大量代码类(class)。所以显而易见的解决方案是有一个抽象基类 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 不会为所有子级提供该功能吗?

此外,将与现有的...类共享大量代码。不是使用继承的直接指示。一般来说,继承是为了扩展,而不是为了重用。如果基类所做的只是实现通用功能但不为这两个类提供通用接口(interface),您可能应该重新考虑该方法。要么对通用方法使用组合和委托(delegate),要么,如果它们没有连续状态,则将通用代码放入(可能是匿名的) namespace 并从您需要的实际功能类中调用它们。您没有提供足够的信息来确定您要做什么。

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

相关文章:

c# - dotnet core api 文件夹结构

oop - OOP 设计模式中的 "Client"概念?

c++ - 从模板类创建对象时出错

c++ - 如何设计一个初始化后常量并且在我的整个程序中只存在一次的类

c++ - Boost Graph 有向图的无向遍历

c++ - 使用不同类型 boost program_options 值

c++ - 当用户在 unordered_map 中自定义哈希函数时,无法解码 g++ 中模糊的编译器错误

c++ - 将 std::vector 元素指针转换为索引

c++ - 如何让 boost::serialization 工作?

c# - C++/C#/Java中的 'Class'的想法是否来自C中的struct?