Разрешено ли и принято ли помечать статический метод как delete? - PullRequest
0 голосов
/ 20 февраля 2019

Предположим, что для всех бизнес-объектов интерфейс предназначен для скрытия реализации.Шаблон 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();
};

Вопросы: используется ли static вместе с удалить как можно хуже или обычное искусство?

1 Ответ

0 голосов
/ 20 февраля 2019

Является ли использование статических и удалений плохим или распространенным искусством?

= delete; - строго говоря, определение функции.Поэтому любая функция может быть определена как удаленная.Функция, являющаяся членом или свободная, статическая или нет, полностью ортогональна удаленному определению.

Следствием удаления является то, что программа, которая ссылается на удаленную функцию, становится плохо сформированной.Направление определяется разрешением перегрузки.

Так что да, это обычная практика - удалять определения, если мы хотим что-то запретить.Похоже, вы хотите предотвратить определение что-то вроде CMyNetworkFactory без getInstance.Но потом я признаюсь, что не вижу, почему вам нужно определить что-либо как удаленное через CRTP.В конце концов, поиск имени, который не может найти getInstance полностью, так же хорош, как и преобразование в удаленное определение, я думаю.

...