Как сделать так, чтобы класс имел доступ только к определенным закрытым членам другого class?

Предположим, у нас есть два класса:

class Base
{
private:
    int x;
public:
    void f();
};

class Foo
{
    // some variables and methods
};

Теперь каждый может вызывать Base::f(), но я хочу, чтобы это мог сделать только Foo.

Чтобы добиться такого эффекта, мы можем сделать Base::f()закрытым и объявить Fooдругом:

class Base
{
private:
    int x;
    void f();
    friend Foo;
};

Проблема с этим подходом заключается в том, что Fooимеет доступ как к Base::f(), так и к Base::x(и даже к любым другим закрытым членам Base). Но я хочу, чтобы Fooимел доступ только к Base::f().

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

РЕДАКТИРОВАТЬ:

Я попытаюсь указать ограничение доступа, которое мне нужно. Во-первых, Base— это интерфейс в библиотеке (фактически это абстрактный класс). Пользователь использует только классы, производные от Base. Base::f()вызывается только Foo, который является другим классом в библиотеке. Сокрытие Base::f()от пользователя важно, потому что только Fooзнает, когда его вызывать. В то же время Fooне должен мешать другим членам Base.

5
задан miloszmaki 15 June 2012 в 15:52
поделиться