По умолчанию использовать функции с именами.
Классы должны создавать объекты, а не заменять пространства имен.
Скотт Мейерс написал целый предмет для своей эффективной книги на C ++ по этой теме: «Предпочитайте функции, не являющиеся членами-членами, для функций-членов». Я нашел онлайн-ссылку на этот принцип в статье из Herb Sutter: http://www.gotw.ca/gotw/084.htm
Важно знать, что: В C ++ функции в том же пространстве имен, что и класс, относятся к интерфейсу этого класса (поскольку ADL будет искать эти функции при разрешении вызовов функций ).
Функции имен, если только объявленный «друг» не имеет доступа к внутренним классам, тогда как статические методы имеют.
Это означает, например, что при сохранении вашего класса , если вам нужно изменить внутренние свойства вашего класса, вам нужно будет искать побочные эффекты во всех его методах, включая статические.
Добавление кода в класс '.
В C # вы можете добавлять методы в класс, даже если у вас нет доступа к нему. Но в C ++ это невозможно.
Но, все еще на C ++, вы все равно можете добавить функцию с именами, даже в класс, который кто-то написал для вас.
См. С другой стороны , это важно при разработке кода, потому что, помещая ваши функции в пространство имен, вы разрешаете вашим пользователям увеличивать / дополнять интерфейс класса.
Сторона -эффект предыдущей точки, невозможно объявить статические методы в нескольких заголовках. Каждый метод должен быть объявлен в одном классе.
Для пространств имен функции из одного и того же пространства имен могут быть объявлены в нескольких заголовках (наиболее подходящим примером является функция почти стандартной замены).
Основная прохлада пространства имен заключается в том, что в некотором коде вы можете не упоминать об этом, если используете ключевое слово «using»:
#include
#include
// 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
#include
{
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 в это пространство имен с использованием ключевого слова.
Пространства имен для n amespaces. Классы предназначены для классов.
C ++ был разработан таким образом, что каждая концепция различна и используется по-разному в разных случаях как решение различных проблем.
Не используйте классы, когда вы нужны пространства имен.
И в вашем случае вам нужны пространства имен.