2015-10-22 2 views
3

Я читаю Scott Meyrse C++, и теперь я нахожусь в разделе об инкапсуляции. Он сказал, что нет возможности инкапсулировать участников данных, если они не объявят их частными. И это понятно.Namespace-private members in C++

Но так как я пришел из Java имею свои package-private метод и член, я заинтересован, если C++ позволяет нам делать некоторые трюки, чтобы объявить некоторые в пространстве имен, так что она недоступна вне пространства имен. Пространство имен - личное или что-то в этом роде. Я думал, что следующий код с помощью анонимного-имен будет хорошо:

namespace A { 
    namespace { //anonymous namespace within the namespace 
     int a; 
    } 
    void foo(){ std::cout << a << std::endl; } 
} 

int main() 
{ 
    A::a = 2; 
    A::foo(); 
} 

Но он работал отлично: http://coliru.stacked-crooked.com/a/b4690b9bb28dad29

+1

Общим соглашением является наличие вложенного пространства имен с именем 'internal'. Он по-прежнему доступен - любой может написать 'A :: internal :: a', но он явно сигнализирует кому-либо за пределами, что они собираются полагаться на внутренние детали реализации, на свой страх и риск. Безымянное пространство имен делает что-то совершенно другое - оно содержит определения, которые ограничены этой единицей перевода (также как исходный файл). –

+0

@IgorTandetnik Действительно, звучит очень рассудком. Большое спасибо за совет. – stella

ответ

3

Я m интересуется, если C++ позволяет нам делать некоторые трюки, чтобы объявить некоторые в пространстве имен, чтобы он был недоступен за пределами пространства имен.

Вы не можете иметь частные пространства имен, где ++ самого языка C будет исполнять свою частную жизнь и держать его недоступным для внешнего мира таким же образом, что частные члены являются.

Во всяком случае, это необходимо сделать, приняв согласованное соглашение об именах в рамках конкретной кодовой базы.

Это похоже на то, как имена методов Python имеют префикс с верхним подчеркиванием _ в качестве условного обозначения, указывающего, что метод (или элемент данных) считается «закрытым» и не должен быть доступен из за пределами.

1

пространства имен {// анонимное пространство имен в пространстве имен

Это unnamed namespace, то есть может быть объявлено с internal linkage, что означает, что любое имя, объявленное в неназванном пространстве имен, имеет внутреннюю связь.

так что позволено делать A :: а = 2

если имя, что пространство имен, как

namespace B 

, то вы должны сделать:

A::B::a = 2;