Спецификаторы доступа C ++, слишком мало? - PullRequest
1 голос
/ 24 сентября 2010

Насколько я знаю, в C ++ есть только 3 спецификатора доступа: private , public , protected

Сэти 3 спецификатора доступа, как я могу сделать метод пригодным для использования для классов в проекте , но непригодным для использования для "иностранцев" ?? (например, внутренние и публичные в C #)

Ответы [ 4 ]

8 голосов
/ 24 сентября 2010

C ++ не знает, что такое проект.

C ++ знает о классах, где он предлагает три указанных вами спецификатора доступа.

C ++ знает о единицах перевода, где он предлагает два доступаСпецификаторы: внутренняя и внешняя связь.

Редактировать: О внутренней и внешней связи, это связано с тем, будет ли символ виден за пределами единицы перевода (объектный файл).Любая глобальная переменная static или const, определенная в TU, имеет внутреннюю связь.Другие имеют внешнюю связь.

5 голосов
/ 24 сентября 2010

Проще говоря, нет. C ++ не похож на C #.

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

1 голос
/ 24 сентября 2010

Вы можете использовать пароль друга идиома .

Хотя это не тот термин, который вы сможете найти. Идея не нова, хотя и не очень распространена, и возникла на SO. Ссылка выше является моей попыткой общего решения (невозможно сделать чисто в C ++ 03, красиво в C ++ 0x).

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


Но в остальном нет . Гораздо более распространенное и более простое решение - просто выбросить свои вещи в пространство имен detail (например, общее для Boost ) и сказать "не ходи".

0 голосов
/ 24 сентября 2010

Две самые близкие вещи, которые у вас есть к решению:

  1. Имейте внутреннее пространство имен, которое вы используете в своем коде, которое вы на самом деле не публикуете. Пользователи вашей библиотеки затем используют любое используемое вами пространство имен, предназначенное для общего пользования. Тем не менее, это не применяется. Это просто запутано тем, что они не обязательно знают о пространстве имен или им не говорят, поэтому они этого не делают.

  2. Используй друга. Это является принудительно установленным компилятором. Если класс является другом другого класса или если функция является другом класса, то он может получить доступ к своим закрытым функциям-членам, в то время как другие не могут. К сожалению, это означает, что у друга есть доступ к всем закрытым членам, поэтому он может предоставить больший доступ к различным классам или функциям, чем вы хотели бы (хотя это было бы внутри ваших собственных классов и функций, а не пользователей вашей библиотеки).

C ++ старше, чем такие языки, как C #, Java и D, которые дают вам более точный контроль над уровнями доступа. C ++ был пионером многих подобных вещей, и это не всегда было правильно. Разработчики более новых языков извлекли уроки из этого и усовершенствовали его во многих отношениях, так что вы найдете в более новых языках определенные концепции, которых нет в C ++ (хотя иногда в C ++ есть концепции, которые не были приняты в более новых языках). Другим примером могут быть пакеты и закрытые / окончательные классы и функции.

...