С++ эквивалент С#
Я пытаюсь выполнить резервное копирование некоторого кода с С# на С++, чтобы обойти раздражающую проблему, и как бы спросить, знает ли кто-нибудь, что эквивалент С# 'internal' будет в С++.
Вот пример использования:
internal int InternalArray__ICollection_get_Count ()
{
return Length;
}
Ответы
Ответ 1
В С++ нет прямого эквивалента internal
. Помимо public
/protected
/private
единственным другим механизмом управления доступом является friend
, механизм которого позволяет отдельным классам доступ ко всем членам вашего собственного класса.
Поэтому его можно использовать как механизм контроля доступа internal
, с большой разницей в том, что:
- вам нужно явно объявлять классы
friend
по очереди
-
friend
классы имеют доступ ко всем членам без исключения; это чрезвычайно высокий уровень доступа и может вводить жесткую связь (что является причиной того, что обычная рефлекторная реакция на friend
"вам это действительно нужно?" )
См. также Когда вы должны использовать "друга" на С++?
Ответ 2
Если ваша идея состоит в том, чтобы изолировать целые модули друг от друга, вы можете попробовать сохранить два набора файлов заголовков - один с "общедоступными" методами, другой с "внутренними". Я не уверен, как избежать дублирования на этом этапе; AFAIK класс может быть объявлен только один раз в блоке компиляции, и для общего и внутреннего заголовков требуется полное определение класса. Один, по общему признанию, очень неуклюжий способ состоит в том, чтобы иметь частичные файлы, такие как _Foo.public.h
и _Foo.internal.h
, которые содержат только объявления методов, а "реальные" файлы заголовков включают один или оба из них в тело объявления класса:
Foo.public.h
class Foo {
#include "_foo.public.h"
}
Foo.internal.h
class Foo {
#include "_foo.internal.h"
}
Исходные файлы будут ссылаться на внутренние заголовки собственного модуля, но на публичные из их зависимостей. Должна быть возможность настроить макет проекта и построить скрипты, чтобы сделать это достаточно прозрачным. (Например, настройка путей включения в соответствующие каталоги для каждого модуля.)
Это просто скрывает "внутренние" элементы вместо реализации фактического контроля доступа и, следовательно, предполагает, что модули скомпилированы отдельно и рассматриваются как двоичные зависимости. Если вы обрабатываете зависимости, вставляя их в исходное дерево и компилируя все сразу, вы должны иметь возможность их создавать в любом случае, а объявления внутреннего метода все еще могут присутствовать в сборке.