假定为所有业务对象设计了一个接口(interface)以隐藏实现。未使用PIMPL模式。

class CNetworkManager : public IMyNetwork {...};

所有这些管理器都是单例方法,例如:

网络管理器
CNetworkManager* CNetworkManager::getInstance();
CNetworkManager* CNetworkManager::destroy();

但是不会导出NetworkManager.h。因此,在内部使用静态方法

NetworkManagerFactory.h
class CMyNetworkFactory
{
    public:
        static IMyNetwork* getInstance();
        static void destroy();
};

NetworkManagerFactory.cpp
IMyNetwork* CMyNetworkFactory::getInstance()
{
    return CNetworkManager::getInstance();
}

但是所有工厂都应使用相同的命名。因此我加了

模板ISingletonFactory.h
template <class Factory, class Interface>
class CSingletonFactory
{
    public:
        ~CSingletonFactory() {}
        static Interface* getInstance() = delete;
        static void destroy() = delete;
};

并将NetworkManagerFactory.h重做为CRTP
class CMyNetworkFactory : public CSingletonFactory<CMyNetworkFactory, IMyNetwork>
{
    public:
        static IMyNetwork* getInstance();
        static void destroy();
};

问题:将静态一起删除可能是不好的做法还是普通技术?

最佳答案


= delete;严格来说是一个函数定义。因此,任何功能都可以定义为已删除。该函数是成员还是免费的,是否静态的,与删除的定义完全正交。

删除的结果是,引用删除功能的程序格式不正确。引用由重载解决方案确定。

因此,是的,如果我们要禁止某些操作,则删除定义是一种常见的做法。您似乎希望避免在不使用CMyNetworkFactory的情况下定义类似getInstance的内容。但是我承认没有看到为什么您需要定义通过CRTP删除的任何内容。毕竟,我认为,名称查找无法完全找到getInstance与解决已删除的定义一样好。

关于c++ - 是否可以使用delete标记静态方法?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54786701/

10-11 22:36
查看更多