Есть ли способ в C ++ сделать интерфейс класса закрытым для всех классов, кроме нескольких? - PullRequest
2 голосов
/ 03 сентября 2010

Я пишу дерево B-ссылок и его сопутствующие подклассы, такие как класс страницы данных, класс узла и т. Д.

Мне было интересно, есть ли способ защиты открытых интерфейсов узлов и страництаким образом, что только сам класс дерева b-link может получить к ним доступ, БЕЗ одновременно выставляя закрытые методы страниц и узлов классу b-link?

IE. Я уже думал о простом изменении 'public'интерфейс страниц и узлов в защищенную категорию, а затем объявление дерева B-ссылок как друга, но это дает доступ к дереву b-link к приватным методам, которые я хочу оставить приватными.

Ответы [ 3 ]

6 голосов
/ 03 сентября 2010

От макушки головы вы можете сделать что-то вроде:

class FooAdapter;

class Foo
{
private:
     void funcToExpose();
     void funcToHide();
     friend FooAdapter;
};

class FooAdapter
{
private:
     Foo foo;
     void funcToExpose() { foo.funcToExpose(); }

     friend SomeFriend;
};

(Не скомпилировано или протестировано, но вы должны понять.)

2 голосов
/ 03 сентября 2010

Вы можете попытаться определить ваши подклассы в анонимном пространстве имен в том же модуле перевода, что и b-дерево. Предположительно, это сделает эти предложения недоступными извне этой единицы перевода.

См. Безымянное / анонимное пространство имен и статические функции

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

Если вы не хотите, чтобы интерфейсы узлов и страниц отображались в вашем API, просто объявите их в файле реализации b-link.Если реализация b-link охватывает более одного файла, поместите объявления классов узлов и страниц в заголовочный файл только для реализации (совмещенный с файлами реализации, а не с заголовками API).

...