Допустим, у меня есть два класса, класс A и класс B, оба из которых определены в пространстве имен NAMESPACE. Оба этих класса используют вспомогательную функцию, helper(). Поскольку оба класса используют эту функцию, я решил, что было бы нормально определять помощника() в файле .h в том же пространстве имен, но за пределами обоих классов. Однако тогда функция видима и пригодна для использования тем, кто использует мой код. Я понимаю, что это противоречит конвенции, и вместо этого эта функция должна быть закрыта каким-то механизмом, поскольку я никогда не хочу, чтобы эта функция была явно вызвана. Однако, чтобы объявить его частным, потребуется, чтобы я объявлял его в обоих классах и, следовательно, дважды определял его в файле .cpp. Каким будет лучший способ создать функцию, которую можно использовать двумя классами, но невидимой для пользователя?Лучшая конвенция для кросс-класса вспомогательной функции
ответ
Одним из общих подходов было бы разместить функцию в пространстве имен в вашем пространстве имен. Это не означает, что другие люди не могут его намеренно использовать, но это не загрязняет пространство имен API.
Альтернативно, если вы реализуете оба класса в одном исходном файле, просто поместите его в анонимное пространство имен в этом исходном файле и вообще не имеете его в заголовке.
Как насчет создания отдельного класса со вспомогательными функциями, объявленными как статические частные функции. В объявлении класса вы также объявляете классы, которые будут использовать эти вспомогательные функции в качестве классов друзей. Таким образом, функции видны классам, которые им нужны, и никому другому.
Это негибкий, отдельный класс должен был бы знать каждого возможного пользователя заблаговременно и объявлять каждого из них как друга. Вместо этого сделайте функцию в новом классе 'protected' и сделайте из нее' A' и 'B', таким образом, только производные классы могут использовать эту функцию. –
struct CommonImpl {
protected:
static void foo() { }
};
struct A : CommonImpl {
void bar() { CommonImpl::foo(); }
};
struct B : CommonImpl {
void bar() { CommonImpl::foo(); }
};
- 1. класса вспомогательной функции альтернатива
- 2. Код вспомогательной функции python
- 3. по результатам вспомогательной функции?
- 4. Что делает хорошее имя для вспомогательной функции?
- 5. Уменьшить отображение страницы Meteor для вспомогательной функции
- 6. Возвращает объект d3 для вспомогательной функции handlebar
- 7. Объявление вспомогательной функции вне класса?
- 8. Выбрасывание исключений из вспомогательной функции
- 9. Конвенция: Сохранение функции функции Python в константе?
- 10. Вызов следующей внутри вспомогательной функции?
- 11. Конвенция @@
- 12. Использование вспомогательной функции в шаблоне
- 13. Magento BaseUrl от вспомогательной функции
- 14. Вызов вспомогательной функции в контроллере
- 15. Сортировка с использованием вспомогательной функции?
- 16. C++ Множественное определение вспомогательной функции
- 17. Синтаксис OCaml для определения вспомогательной функции внутри другой функции?
- 18. Конвенция для указателя *
- 19. Конвенция для форматирования CSS
- 20. Конвенция для кодирования Хаффмана
- 21. Стандартная конвенция для использования «СТД»
- 22. Лучшая практика для запоминания функции
- 23. Эквивалент URL) вспомогательной функции (в Zend контроллер
- 24. Как захватить многострочный вывод вспомогательной функции?
- 25. pytest assert introspection в вспомогательной функции
- 26. Установка двух указателей, равных в вспомогательной функции
- 27. Параметр пропуска Python3 внутренней вспомогательной функции
- 28. Как использовать find/findOne вне вспомогательной функции
- 29. питона: импорт вспомогательной функции в модуле
- 30. ZF2 - переопределение навигационного меню вид вспомогательной функции
Контроль доступа C++ ('public',' private' и т. Д.) Применим только к членам класса, поэтому какая функция языка, которую вы могли бы использовать для двух разных классов, имела бы ту же функцию, что и член? –
@PaulRenton, как это поможет? Друг мог получить доступ к частным членам 'A' и' B', но это не то, что нужно. Друг будет доступен для всех пользователей, но это не то, что нужно. –
Вы правы, я неправильно понял его вопрос. Удаление комментария. –