C++ 是否允许并接受使用delete标记静态方法?
假设为所有业务对象设计了一个接口来隐藏实现。PIMPL模式未被使用C++ 是否允许并接受使用delete标记静态方法?,c++,static,crtp,C++,Static,Crtp,假设为所有业务对象设计了一个接口来隐藏实现。PIMPL模式未被使用 class CNetworkManager : public IMyNetwork {...}; 所有这些管理者都是单身者,其方法如下: NetworkManager.h CNetworkManager* CNetworkManager::getInstance(); CNetworkManager* CNetworkManager::destroy(); 但NetworkManager.h未导出。因此,内部使用静态方法 N
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();
静态空洞破坏();
};
问题:静态与删除一起使用是尽可能糟糕还是常见的艺术
静态和删除的使用是尽可能糟糕还是常见的艺术
=删除严格来说,code>是一个函数定义。因此,任何函数都可以定义为已删除。函数是成员还是自由的,是静态的还是非静态的,与已删除的定义完全正交
删除的结果是,引用已删除函数的程序格式错误。引用由重载解析决定
是的,如果我们想禁止某些东西,通常会删除一个定义。您似乎希望防止在没有getInstance
的情况下定义类似CMyNetworkFactory
的内容。但我承认,我不明白为什么需要将任何内容定义为通过CRTP删除。毕竟,名称查找无法完全找到getInstance
,我认为这与解析已删除的定义一样好。所有工厂被要求声明相同方法的原因是什么?对于已删除的getInstance
(除了创建编译器错误之外)您无能为力。不声明它们有什么错?通常=delete
是告诉编译器不要合成例程,否则该例程将由编译器合成。一些开发人员在编译器不会合成的例程上放入=delete
,以明确告知后续开发人员它不在那里(但事实证明,这也会导致一些问题,因为隐式未合成与显式未合成不同;当问题出现时,这是非常明显的)。“尽可能糟糕”不,可能更糟;)。只是不清楚这样做的动机是什么。我不会这样说,但至少添加一条注释使用CRTP的目的是强制实现静态方法。非静态是不可能的,因为没有实例。