Можем ли мы достичь инкапсуляции, используя пространство имен? - PullRequest
2 голосов
/ 27 сентября 2019

Можем ли мы добиться инкапсуляции, используя пространство имен в c ++?Или это зависит от компилятора?

Ответы [ 2 ]

4 голосов
/ 27 сентября 2019

Да, вы можете достичь степени инкапсуляции, используя пространства имен.

Очевидное ограничение заключается в том, что вы не можете создавать экземпляры пространств имен, поэтому то, что вы инкапсулируете в пространство имен, обычно не поддерживает экземпляры.,Итак, если вы хотите инкапсулировать что-то вроде «как была настроена программа для запуска», пространство имен, вероятно, работает нормально.Если вы хотите инкапсулировать данные, которые вы собираетесь хранить о каждом элементе в базе данных элементов, есть вероятность, что пространство имен не окажет большой (если вообще) помощь.

Чтобы действительно ограничить доступ кданные, вы должны использовать пространства имен в сочетании с другими функциями.В частности, имена в анонимном пространстве имен видимы (без квалификации) для кода в той же единице перевода - но совершенно невидимы вне этой единицы перевода.

// A.cpp
namespace { 
    int foo;
}

int bar() {
    // this code has free access to foo
}

// B.cpp
int baz() { 
    // this code has no access to foo
}

Так что в этом случае мы инкапсулировалидоступ к foo, поэтому только код в A.cpp может получить к нему доступ.Как и в случае с членом класса, код в A.cpp также может передавать ссылку или указатель на foo на какой-либо другой код вне A.cpp, чтобы предоставить ему доступ к foo.

3 голосов
/ 27 сентября 2019

Вид. Для википедии инкапсуляция - это

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

Если вы просто сосредотачиваетесь на первой части, тогда ответ - да.Это позволяет группировать функции и переменные в поле.

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


Если вы хотите инкапсуляцию, просто используйте класс.Они созданы для этого.

...