gpt4 book ai didi

c++ - CRTP 模式和 enable_shared_from_this

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:56:30 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com