C ++ static-only class - PullRequest
       4

C ++ static-only class

3 голосов
/ 01 октября 2011

У меня есть набор функций, которые я хочу поместить в отдельное пространство имен или в класс.Из двух, что было бы лучше?Если это последний, как я должен идти об этом?Я имею в виду, у меня нет членов экземпляра, поэтому я должен указать конструктор как частный?Или удалить это?

В любом случае, это будет выглядеть примерно так, чтобы дать вам представление:

myproject::foo::f()

Ответы [ 2 ]

11 голосов
/ 01 октября 2011

Пространства имен и класс C ++ могут содержать как функции, так и другие типы, но есть некоторые ключевые различия в поведении.Вы должны решить, что лучше всего подходит для ваших конкретных обстоятельств.

  • Классы могут быть шаблонными, а пространства имен - нет.Это позволяет передавать набор аргументов шаблона целой группе функций и другим типам.В сочетании с typedef это может быть очень мощным.

  • Вы можете использовать using namespace xyz;, чтобы вывести целую группу членов пространства имен в любую область.Классы могут быть унаследованы, чтобы привести их в область действия (не имеет большого эффекта, если нет элементов экземпляра, из-за пустой базовой оптимизации, но статические члены могут затем использоваться без квалификации), но это работает только внутри других классов.Свободные функции должны были бы явно квалифицировать весь доступ к членам класса.

  • Пространства имен участвуют в зависимом от аргумента поиске, члены родительского класса - нет.

Если вы хотите использовать прием наследования класса для предоставления аргументов шаблона и получения неквалифицированного доступа к его статическим членам, то вы должны оставить конструктор и деструктор как дефолтные и тривиальные вместо того, чтобы удалять или делать их недоступными,В C ++ 11 вы можете пометить конструктор как защищенный и как дефолтный.

1 голос
/ 01 октября 2011

Если вы используете класс, то лучше объявить конструктор по умолчанию, конструктор копирования, оператор присваивания и деструктор private / unimplemented (плюс, возможно, еще немного для C ++ 11). Если нет, у вас будет класс, который можно использовать для создания бесполезных объектов. Если вы используете пространство имен, вам не нужно ничего этого делать.

Классы сделаны для объектов. Использование их в качестве контейнеров статических функций, без данных-членов, является большим злоупотреблением, чем использование.

...