Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否允许并接受使用delete标记静态方法?_C++_Static_Crtp - Fatal编程技术网

C++ 是否允许并接受使用delete标记静态方法?

C++ 是否允许并接受使用delete标记静态方法?,c++,static,crtp,C++,Static,Crtp,假设为所有业务对象设计了一个接口来隐藏实现。PIMPL模式未被使用 class CNetworkManager : public IMyNetwork {...}; 所有这些管理者都是单身者,其方法如下: NetworkManager.h CNetworkManager* CNetworkManager::getInstance(); CNetworkManager* CNetworkManager::destroy(); 但NetworkManager.h未导出。因此,内部使用静态方法 N

假设为所有业务对象设计了一个接口来隐藏实现。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();
}
但所有工厂都应该使用相同的名称。于是我又加了一句

模板为singletonfactory.h

template <class Factory, class Interface>
class CSingletonFactory
{
    public:
        ~CSingletonFactory() {}
        static Interface* getInstance() = delete;
        static void destroy() = delete;
};
模板
类CSingleton工厂
{
公众:
~CSingletonFactory(){}
静态接口*getInstance()=delete;
静态void destroy()=删除;
};
并将NetworkManagerFactory.h修改为CRTP

class CMyNetworkFactory : public CSingletonFactory<CMyNetworkFactory, IMyNetwork>
{
    public:
        static IMyNetwork* getInstance();
        static void destroy();
};
类CMyNetworkFactory:公共CSingletonFactory
{
公众:
静态IMyNetwork*getInstance();
静态空洞破坏();
};
问题:静态删除一起使用是尽可能糟糕还是常见的艺术

静态和删除的使用是尽可能糟糕还是常见的艺术

=删除是一个函数定义。因此,任何函数都可以定义为已删除。函数是成员还是自由的,是静态的还是非静态的,与已删除的定义完全正交

删除的结果是,引用已删除函数的程序格式错误。引用由重载解析决定


是的,如果我们想禁止某些东西,通常会删除一个定义。您似乎希望防止在没有
getInstance
的情况下定义类似
CMyNetworkFactory
的内容。但我承认,我不明白为什么需要将任何内容定义为通过CRTP删除。毕竟,名称查找无法完全找到
getInstance
,我认为这与解析已删除的定义一样好。

所有工厂被要求声明相同方法的原因是什么?对于已删除的
getInstance
(除了创建编译器错误之外)您无能为力。不声明它们有什么错?通常
=delete
是告诉编译器不要合成例程,否则该例程将由编译器合成。一些开发人员在编译器不会合成的例程上放入
=delete
,以明确告知后续开发人员它不在那里(但事实证明,这也会导致一些问题,因为隐式未合成与显式未合成不同;当问题出现时,这是非常明显的)。“尽可能糟糕”不,可能更糟;)。只是不清楚这样做的动机是什么。我不会这样说,但至少添加一条注释使用CRTP的目的是强制实现静态方法。非静态是不可能的,因为没有实例。