За замовчуванням використовуйте функції простору імен.
Класи - це створення об'єктів, а не заміна просторів імен.
В об'єктно-орієнтованому коді
Скотт Майєрс написав цілий пункт для своєї ефективної книги C ++ на цю тему "Віддавайте перевагу функціям, що не належать до друзів, перед функціями членів". Я знайшов онлайн-посилання на цей принцип у статті від Herb Sutter:http://www.gotw.ca/gotw/084.htm
Важливо знати, що: У C ++ функції в тому ж просторі імен, що і клас, належать до інтерфейсу цього класу (оскільки ADL здійснюватиме пошук цих функцій при вирішенні викликів функцій).
Функції, розміщені в іменах, якщо не оголошені "friend", не мають доступу до внутрішніх даних класу, тоді як статичні методи мають.
Це означає, наприклад, що при підтримці класу, якщо вам потрібно змінити внутрішню частину класу, вам потрібно буде шукати побічні ефекти у всіх його методах, включаючи статичні.
Розширення I
Додавання коду до інтерфейсу класу.
У C # ви можете додати методи до класу, навіть якщо у вас немає доступу до нього. Але в C ++ це неможливо.
Але все ж у C ++ ви можете додати функцію простору імен, навіть до класу, який хтось написав для вас.
Дивіться з іншого боку, це важливо при розробці коду, оскільки, розміщуючи свої функції в просторі імен, ви дозволяєте користувачам збільшувати / доповнювати інтерфейс класу.
Розширення II
Побічним ефектом попереднього пункту неможливо оголосити статичні методи у кількох заголовках. Кожен метод повинен бути оголошений в одному класі.
Для просторів імен функції з одного простору імен можуть бути оголошені в декількох заголовках (найкращим прикладом цього є майже стандартна функція swap).
Розширення 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 ++ був розроблений таким чином, щоб кожна концепція була різною, і використовується по-різному, в різних випадках, як вирішення різних проблем.
Не використовуйте класи, коли вам потрібні простори імен.
І у вашому випадку вам потрібні простори імен.