允许并接受用删除标记静态方法吗?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了允许并接受用删除标记静态方法吗?相关的知识,希望对你有一定的参考价值。

假设所有业务对象都设计了一个接口来隐藏实现。 PIMPL模式未使用。

class CNetworkManager : public IMyNetwork {...};

所有这些经理都是单身人士,其方法如下:

NetworkManager.h

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就像它解析为已删除的定义一样好,我想。

以上是关于允许并接受用删除标记静态方法吗?的主要内容,如果未能解决你的问题,请参考以下文章

在列表中存储标记位置

在具有可接受/惯用的静态初始化程序的类中使用空静态方法吗?

如何允许表单在不处理 Windows 消息的情况下接受文件删除?

如何从GoogleMapsAPI中的静态数组中删除特定标记

Android,如何从 Google Map V2 中删除所有标记?

有人知道下面的代码片段是啥意思吗?