C ++, как создать вложенный класс для пересылки ваших методов? - PullRequest
0 голосов
/ 24 июля 2011

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

class API
{
public:
    go();
    stop();
    friend class B
    {
    public:
        void public_request()
        {
            request();
        }
        void public_go()
        {
            go()
        }
    };
private:
    void request(){}
};

Возможно лиреализовать такой вложенный класс в C ++ и как?

Ответы [ 3 ]

2 голосов
/ 24 июля 2011

Можно создать Локальный класс в C ++.Локальный класс - это класс, определенный внутри функции.
Но такой класс имеет несколько ограничений.Подробнее об этом здесь .

Вы не можете создать Вложенные классы в C ++, как в Java, хотя.Вложенный класс - это класс, входящий в область действия другого класса.

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

Два важных момента, которые следует отметить с помощью вложенных классов:

  1. Функции-члены вложенного класса следуют правилам обычного доступа и не имеют специальных привилегий доступа для членов своих включающих классов.
  2. Функции-члены класса включения не имеют специального доступа к членам вложенного класса.

Так что вам нужно будет использовать состав или явно передать указательили ссылка объекта внешнего класса на вложенный класс

1 голос
/ 24 июля 2011

Да, но вы должны предоставить экземпляр внешнего класса при создании внутреннего ... эти два типа [в основном] независимы, поэтому B не связан ни с каким конкретным экземпляром API.

Больше псевдокода

struct API {
   void go();
   struct B {
       B(API& api) : api(api) { }
       void go() { api.go(); }
   };
};

API a;
B b(a);
b.go();

Кроме того, вы можете передать экземпляр API в функцию B [B::go(API&)]

struct API {
   void go();
   struct B {
       void go(API& api) { api.go(); }
   };
};

API a1, a2;
B b;
b.go(a1);
b.go(a2);

Кроме того, API не содержит экземпляр B, если вы явно не добавите экземпляр.

struct API {
  struct B { };
  B b;
};

Также обратите внимание, что B не нужно предоставлять дружбу API. Как внутренний класс, B может уже иметь доступ к API закрытым / защищенным членам. Обратное неверно, однако ... API не может получить доступ к B закрытым / защищенным членам, если только B не предоставит ему разрешение.

1 голос
/ 24 июля 2011

Не напрямую, по крайней мере, не так, как в Java.Ваш вложенный класс должен содержать указатель или ссылку на «внешний» класс.

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