2013-07-15 2 views
3

Допустим, у меня есть два класса, класс A и класс B, оба из которых определены в пространстве имен NAMESPACE. Оба этих класса используют вспомогательную функцию, helper(). Поскольку оба класса используют эту функцию, я решил, что было бы нормально определять помощника() в файле .h в том же пространстве имен, но за пределами обоих классов. Однако тогда функция видима и пригодна для использования тем, кто использует мой код. Я понимаю, что это противоречит конвенции, и вместо этого эта функция должна быть закрыта каким-то механизмом, поскольку я никогда не хочу, чтобы эта функция была явно вызвана. Однако, чтобы объявить его частным, потребуется, чтобы я объявлял его в обоих классах и, следовательно, дважды определял его в файле .cpp. Каким будет лучший способ создать функцию, которую можно использовать двумя классами, но невидимой для пользователя?Лучшая конвенция для кросс-класса вспомогательной функции

+1

Контроль доступа C++ ('public',' private' и т. Д.) Применим только к членам класса, поэтому какая функция языка, которую вы могли бы использовать для двух разных классов, имела бы ту же функцию, что и член? –

+0

@PaulRenton, как это поможет? Друг мог получить доступ к частным членам 'A' и' B', но это не то, что нужно. Друг будет доступен для всех пользователей, но это не то, что нужно. –

+0

Вы правы, я неправильно понял его вопрос. Удаление комментария. –

ответ

4

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

Альтернативно, если вы реализуете оба класса в одном исходном файле, просто поместите его в анонимное пространство имен в этом исходном файле и вообще не имеете его в заголовке.

0

Как насчет создания отдельного класса со вспомогательными функциями, объявленными как статические частные функции. В объявлении класса вы также объявляете классы, которые будут использовать эти вспомогательные функции в качестве классов друзей. Таким образом, функции видны классам, которые им нужны, и никому другому.

+0

Это негибкий, отдельный класс должен был бы знать каждого возможного пользователя заблаговременно и объявлять каждого из них как друга. Вместо этого сделайте функцию в новом классе 'protected' и сделайте из нее' A' и 'B', таким образом, только производные классы могут использовать эту функцию. –

1
struct CommonImpl { 
protected: 
    static void foo() { } 
}; 

struct A : CommonImpl { 
    void bar() { CommonImpl::foo(); } 
}; 

struct B : CommonImpl { 
    void bar() { CommonImpl::foo(); } 
}; 
Смежные вопросы