У меня есть класс, который имеет 5 статических государственных функций и 1 статическую закрытую функцию (названный от одной из государственных функций). Класс не имеет никаких членских переменных. Мне кажется, что это должно быть пространство имен и не класс. Но что сделать с закрытой функцией? Я предпочитаю, чтобы это не было доступно каждым пользователем пространства имен, но в пространствах имен нет никакого управления доступом.
Есть два способа, которые я знаю о
Один способ - не объявлять эти функции внутри заголовка. Они могут быть помещены только в безымянные пространства имен внутри реализационного файла.
Действительно, тогда вам придется реализовать любую функцию, которая обращается к этой частной функции в реализационном файле (а не в заголовке).
Предпочтительно, чтобы вы поместили их в другой заголовок и включили. Чтобы их код не нарушал заголовок вашего интерфейса. Вот как boost
делает это тоже:
#include "detail/destroy.hpp"
namespace orbit {
void destroy() {
detail::destroy_planets();
detail::destroy_stars();
}
}
Я не думаю, что есть решение для этого :)
Одно -different-решение, было бы для разделения этих функций в отдельный блок компиляции, затем объявляют частные функции внутри анонимного пространства имен.
Держите публичную декларацию в заголовом файле. Переместите реализации в файл CPP. Отметьте ранее Частный
Методы Статические
. Это сделает их недоступными из другого линкера объектов (подборных единиц) и эффективно их скрывать.
Другое решение, которое, однако, не удается полностью избавить от классов, было бы сохранить все частные функции в каком-то классе в качестве статических методов и иметь публичные функции в пространстве имен. Затем позвольте общественным функциям использовать класс, используя друг
:
#include <iostream>
// forward declaration of Module::PublicFn()
namespace Module {
void PublicFn();
};
// static class for private functions (methods)
class ModulePrivates
{
private:
// disallow instantiation by making constructor private
ModulePrivates() { }
private:
// example of a private function
static void PrivateFn()
{
std::cout << "ModulePrivates::PrivateFn() called." << std::endl;
}
// allow public function to call PrivateFn()
friend void Module::PublicFn();
};
// namespace for public functions
namespace Module
{
void PublicFn()
{
std::cout << "Module::PublicFn() called." << std::endl;
ModulePrivates::PrivateFn();
}
};
Это явно только полупроходное решение, поскольку вы могли бы просто держать все в классе (что я бы предложил !). Тем не менее, вы получаете пространство имен с публичными функциями, только будет один дополнительный класс (который, однако, не может быть создан и что выглядит пустым от «снаружи».)
Мне кажется, что это должен быть класс, а не пространство имён. Пространства имен в С++ в первую очередь являются инструментами разрешения имен, не предназначены для проектирования и не обеспечивают инкапсуляции. Поэтому я бы оставил все как есть.