Как ограничить часть открытого интерфейса класса только одним классом? - PullRequest
1 голос
/ 30 июня 2011

Ниже приведен интерфейс:

class SIM{
private:
//private data

public:
Send();
Display();
Recieve();
Encrypt();
};

Как ограничить доступ к функции Display() (она должна находиться в public части) из SIM для других классов, кроме одного класса (Neo и т. Д.).Я не хочу использовать friend и т. Д.

Редактировать:

Я могу переместить отображение () в приватное состояние, как разрешить только классу NEOполучить доступ к этому?0_о

Ответы [ 5 ]

3 голосов
/ 30 июня 2011

Вы можете Display взять фиктивную константную ссылку на тип, который может быть создан только из частного вложенного класса, в который вы хотите делать вызовы.Затем, чтобы передать этот тип в Display, вы должны быть членом этого класса.

Но зачем вам это делать, если friend делает именно то, что вы хотите?

Кодпример:

class AllowedCaller
{
private:
    class FriendHackHelp
    {
    };

public:
    class FriendHack
    {
    public:
        // You can only create a FriendHack from inside this class now...
        FriendHack(const FriendHackHelp&) { }
    };

    void run();
};

class Displayer
{
public:
    void Display(const AllowedCaller::FriendHack&) { /* Whatever */ }
};

void AllowedCaller::run()
{
    Displayer d;
    d.Display(FriendHack(FriendHackHelp()));
}

int main()
{
    return 0;
}
2 голосов
/ 30 июня 2011

В C ++ это просто невозможно.Что вы можете сделать, это передать класс Neo в качестве параметра функции Display() в качестве ссылки, и вы получите аналогичный эффект.

0 голосов
/ 30 июня 2011

В прошлом я тоже размышлял об этом, проверьте следующие вопросы:

язык программирования с гранулярным методом и доступом к свойству

способ скрыть конкретную функцию в c ++

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

так что вам нужно реализовать все интерфейсы с множественным наследованием

0 голосов
/ 30 июня 2011

Позвольте мне задать вам вопрос: что же такое нео? Может ли он быть унаследован от SIM-карты? Если это так, сделайте Display () protected вместо private.

0 голосов
/ 30 июня 2011

Вы также можете разделить свой класс SIM на 2 класса: отображаемый (с помощью метода Display) и SIM (с помощью оставшихся методов). Затем при создании класса Neo просто не расширяйте класс Displayable.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...