Другое решение, которое, однако, не позволяет полностью избавиться от классов, состоит в том, чтобы сохранить все частные функции в некотором классе в качестве статических методов и иметь открытые функции в пространстве имен. Затем разрешите открытым функциям использовать класс, используя friend
:
#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();
}
};
Это явно только промежуточное решение, так как вы могли бы также держать все в классе (это то, что я бы предложил!). Тем не менее, вы получаете пространство имен с открытыми функциями, только будет один дополнительный класс (который, однако, не может быть создан и который выглядит пустым снаружи).