Делаем классы общедоступными для других классов в C ++ - PullRequest
9 голосов
/ 25 января 2011

Если у меня есть два класса, например, следующим образом:

class A {...}

class B {...}

Если я хочу сделать класс A общедоступным для класса B, могу ли я просто сделать члены класса A общедоступнымиили я могу просто использовать public class A {...}?

Можно ли, например, сказать классу B, что только класс A открыт для вас?Другими словами, могу ли я сделать открытые классы для A защищенными или приватными для других?Или это просто вопрос получения класса (наследования)?

Спасибо.

Ответы [ 3 ]

17 голосов
/ 25 января 2011

Существует существенная разница между тем, чтобы сделать класс общедоступным и сделать его содержимое общедоступным.

Если вы определили свой класс во включаемом файле (.h файл), то вы сделаете свой класс общедоступным.Любой другой исходный файл, который включает этот включаемый файл, будет знать об этом классе и, например, может иметь указатель на него.

Единственный способ сделать класс закрытым, это поместить его определение в источник (.cpp) file.

Даже если вы делаете класс общедоступным, вам не обязательно делать содержимое вашего класса общедоступным.Следующий пример является крайним:

class MyClass
   {
   private:
      MyClass();
      ~MyClass();
      void setValue(int i);
      int getValue() const;
   };

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

Вы делаете содержание класса общедоступным, помещая методы из него в «публичную» часть определения класса.вот так:

class MyClass
   {
   public:
      MyClass();
      ~MyClass();
      int getValue() const;
   private:
      void setValue(int i);
   };

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

Если вы хотите сделать класс общедоступным только для какого-то другого класса вашего приложения, но не длязавершив приложение, вы должны объявить этот другой класс другом, например:

class SomeOtherClass;
class MyClass
   {
   friend SomeOtherClass;
   public:
      MyClass();
      ~MyClass();
      int getValue() const;
   private:
      void setValue(int i);
   };

Теперь SomeOtherClass может получить доступ ко всем закрытым методам из MyClass, поэтому он может вызвать setValue, чтобы установить значение MyClass.Все остальные классы по-прежнему ограничены открытыми методами.

К сожалению, в C ++ нет способа сделать общедоступной только часть вашего класса для ограниченного набора других классов.Итак, если вы сделаете другой класс другом, он сможет получить доступ ко всем закрытым методам.Поэтому ограничьте количество друзей.

3 голосов
/ 25 января 2011

Если B имеет сильную взаимозависимость с A, я предлагаю вам использовать вложенный класс. К счастью, вложенный класс может быть защищенным или закрытым.

class A {
protected:
     // the class A::B is visible from A and its
     // inherited classes, but not to others, just
     // like a protected member.
     class B {
     public:
         int yay_another_public_member();
     };
public:
     int yay_a_public_member();
};
3 голосов
/ 25 января 2011

Вы можете использовать дружбу.

class A { friend class B; private: int x; };
class B { B() { A a; a.x = 0; // legal };
...