По умолчанию используйте функции пространства имен.
Классы предназначены для создания объектов, а не для замены пространств имен.
В объектно-ориентированном коде
Скотт Мейерс написал целую статью для своей книги «Эффективное C ++» на эту тему: «Предпочитайте функции, не являющиеся членами, не являющимися друзьями, функциям-членам». Я нашел онлайн ссылку на этот принцип в статье Херба Саттера:http://www.gotw.ca/gotw/084.htm
Важно знать следующее: в C ++ функции в том же пространстве имен, что и класс, принадлежат интерфейсу этого класса (потому что ADL будет искать эти функции при разрешении вызовов функций).
Функции пространств имен, если они не объявлены «другом», не имеют доступа к внутренним объектам класса, в то время как статические методы имеют.
Это означает, например, что при ведении вашего класса, если вам нужно изменить внутренние компоненты вашего класса, вам нужно будет искать побочные эффекты во всех его методах, включая статические.
Расширение I
Добавление кода в интерфейс класса.
В C # вы можете добавлять методы в класс, даже если у вас нет к нему доступа. Но в C ++ это невозможно.
Но все же в C ++ вы все еще можете добавить функцию пространства имен даже в класс, который кто-то написал для вас.
С другой стороны, это важно при разработке вашего кода, потому что, помещая ваши функции в пространство имен, вы разрешаете своим пользователям расширять / дополнять интерфейс класса.
Расширение II
Побочным эффектом предыдущего пункта является невозможность объявления статических методов в нескольких заголовках. Каждый метод должен быть объявлен в одном классе.
Для пространств имен функции из одного и того же пространства имен могут быть объявлены в нескольких заголовках (лучшим примером является почти стандартная функция подкачки).
Расширение III
Основная крутость пространства имен заключается в том, что в некотором коде вы можете не упоминать его, если используете ключевое слово «using»:
#include <string>
#include <vector>
// Etc.
{
using namespace std ;
// Now, everything from std is accessible without qualification
string s ; // Ok
vector v ; // Ok
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
И вы даже можете ограничить «загрязнение» одним классом:
#include <string>
#include <vector>
{
using std::string ;
string s ; // Ok
vector v ; // COMPILATION ERROR
}
string ss ; // COMPILATION ERROR
vector vv ; // COMPILATION ERROR
Этот «шаблон» является обязательным для правильного использования почти стандартной идиомы подкачки.
И это невозможно сделать со статическими методами в классах.
Итак, пространства имен C ++ имеют свою семантику.
Но это идет дальше, так как вы можете комбинировать пространства имен способом, похожим на наследование.
Например, если у вас есть пространство имен A с функцией AAA, пространство имен B с функцией BBB, вы можете объявить пространство имен C и ввести AAA и BBB в это пространство имен с помощью ключевого слова, используя.
Вывод
Пространства имен предназначены для пространств имен. Занятия для занятий.
C ++ был спроектирован таким образом, чтобы каждая концепция была разной и в разных случаях использовалась по-разному как решение разных проблем.
Не используйте классы, когда вам нужны пространства имен.
И в вашем случае вам нужны пространства имен.