То, что сделать с членом парламента, не занимающим официального поста, функционирует при превращении статического класса к пространству имен в C++?

У меня есть класс, который имеет 5 статических государственных функций и 1 статическую закрытую функцию (названный от одной из государственных функций). Класс не имеет никаких членских переменных. Мне кажется, что это должно быть пространство имен и не класс. Но что сделать с закрытой функцией? Я предпочитаю, чтобы это не было доступно каждым пользователем пространства имен, но в пространствах имен нет никакого управления доступом.

6
задан Igor Oks 17 January 2010 в 12:15
поделиться

5 ответов

Есть два способа, которые я знаю о

Не объявлять их в заголовке

Один способ - не объявлять эти функции внутри заголовка. Они могут быть помещены только в безымянные пространства имен внутри реализационного файла.

Действительно, тогда вам придется реализовать любую функцию, которая обращается к этой частной функции в реализационном файле (а не в заголовке).

Поместите их в подробное пространство имён

Предпочтительно, чтобы вы поместили их в другой заголовок и включили. Чтобы их код не нарушал заголовок вашего интерфейса. Вот как boost делает это тоже:

#include "detail/destroy.hpp"

namespace orbit {
  void destroy() {
    detail::destroy_planets();
    detail::destroy_stars();
  }
}
13
ответ дан 8 December 2019 в 03:39
поделиться

Я не думаю, что есть решение для этого :)

Одно -different-решение, было бы для разделения этих функций в отдельный блок компиляции, затем объявляют частные функции внутри анонимного пространства имен.

8
ответ дан 8 December 2019 в 03:39
поделиться

Держите публичную декларацию в заголовом файле. Переместите реализации в файл CPP. Отметьте ранее Частный Методы Статические . Это сделает их недоступными из другого линкера объектов (подборных единиц) и эффективно их скрывать.

4
ответ дан 8 December 2019 в 03:39
поделиться

Другое решение, которое, однако, не удается полностью избавить от классов, было бы сохранить все частные функции в каком-то классе в качестве статических методов и иметь публичные функции в пространстве имен. Затем позвольте общественным функциям использовать класс, используя друг :

#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();
    }
};

Это явно только полупроходное решение, поскольку вы могли бы просто держать все в классе (что я бы предложил !). Тем не менее, вы получаете пространство имен с публичными функциями, только будет один дополнительный класс (который, однако, не может быть создан и что выглядит пустым от «снаружи».)

0
ответ дан 8 December 2019 в 03:39
поделиться

Мне кажется, что это должен быть класс, а не пространство имён. Пространства имен в С++ в первую очередь являются инструментами разрешения имен, не предназначены для проектирования и не обеспечивают инкапсуляции. Поэтому я бы оставил все как есть.

3
ответ дан 8 December 2019 в 03:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: